2017-12-05 16 views
1

내가 할당에서 일하고 있어요,하지만 난 내 코드에 문제가 있어요 :C 문자열 함수 오류

int is_ascii_match(const char c1[], const char c2[], char res[MAX_STRING_SIZE]) { 
.... 

    if (val_c1 == val_c2) { 
     strcpy(res, strcat(strcat(c1, '&'),c2)); 
    } 
    else 
     return 0; 

내가 오류 받고 있어요 :

액세스 위반 위치

을 읽는

매개 변수를 잘못 전달했거나 ..?

+0

'val_c1'과'val_c2'의 계산과 값이 질문과 관련이 있습니까? 그렇지 않은 경우 왜이 줄을 포함합니까? 그렇다면 무엇입니까? – usr2564301

+0

평판의 사용자가 [최소한의 완전한 예제] (https://stackoverflow.com/help/mcve)에 대해 알지 못한다고 생각합니다. – Beta

+0

그 이유는 오류가 String 함수에서 전달하는 인수와 관련이 있다고 가정했기 때문이며 다른 정보가 필요하지 않다는 것을 알 수 있습니다. @Beta, 여전히 C++에 익숙하지 않으므로 잘못되었습니다. – sagi

답변

2

strcat은 비 const char*을 예상합니다. 컴파일러가 불평하는 이유는 const입니다.

또한 두 번째 매개 변수는 "&"입니다. (이전에 char을 전달했습니다.) 표준 §7.24.3.1

char *strcat(char * restrict s1, const char * restrict s2); 

가입일

strcat 함수는 문자열의 복사본 가 가리키는 문자열의 끝에 (널 종료 문자를 포함) s2 가리키는 추가 s1.

따라서 은 수정되지 않은 이유입니다 (첫 번째 매개 변수).

+0

감사합니다. 가능하면 승인하겠습니다. – sagi

+0

맞지 않습니다. 바깥 쪽 'strcat'또는 내면쪽에 대해 이야기하고 있습니까? const가 아닌 것이어야 할 때 const가되는 인수는 무엇입니까? – Beta

+0

@ 베타 : 첫 번째 수정됩니다. – coderredoc

0

'&'은 작은 정수인 문자 리터럴입니다. strcat의 두 번째 인수는 문자에 대한 포인터 인 const char*입니다 (정확히 말하면 연속 NUL 종료 배열 char 초의 첫 번째 문자에 대한 포인터). 아마도 2 바이트 배열 인 "&"을 사용하려고했을 것입니다.

작은 정수를 포인터로 해석하면 오류로 표시된 문제가 발생합니다.

두 번째 인수를 읽는 데 문제가없는 경우 strcat이 첫 번째 인수 ()를 가리키는 문자열을 수정하려고 시도 할 때 오류가 발생하여 읽기 전용 메모리로 간주 될 수 있습니다.

경고를 사용하여 컴파일하는 경우 인수의 유형에 대한 경고가 표시되어야합니다.

이 특정 문제의 경우 c1을 수정하지 않고 버퍼 오버플로를 방지하는 snprintf(res, MAX_STRING_SIZE, "%s&%s", c1, c2)을 사용하는 것이 좋습니다. (자르면 걱정할 필요없이 반환 값을 MAX_STRING_SIZE과 비교해야합니다.)