2014-04-09 4 views
0

이 코드 조각은 2 개의 문자열을 연결해야하지만 버스 오류가 발생합니다 : 10. 그것에 대해 조사 했으므로 t1에 더 많은 공간을 주었지만 여전히 그 오류가 발생했습니다. 너 나 좀 도와 줄 수있어? 미리 감사드립니다.버스 오류 : 10 이유를 모름

char *strCat (char s1[], char s2[]) 
{ 
    int i=0,j=0; 

    while (s1[i++]); 

    while (s2[j]) 
    { 
     s1[j++] = s2[j++]; 
    } 

    s1[j] = '\0'; 

    return s1; 
} 

int main() 
{ 
    char t1[10] = "asd"; 
    char t2[] = "fgh"; 
    printf("%s", strCat(t1,t2)); 
} 
+0

's1 [j ++] = s2 [j ++];'* *. 여기에 정의되지 않은 동작이 호출됩니다. 한 줄에'j ++', 다른 줄에's1 [j] = s2 [j]'를하십시오. – computerfreaker

+0

@computerfreaker하지만 같은 것은 아닌가요? 어쨌든, 나는 변화를 만들었지 만, 결과로 나는 "asdfgh"가 아니라 "fgh"을 얻었다. 뭐가 잘못 됐니? –

+0

사실 전혀 같은 것이 아닙니다. 같은 줄에서'j ++ '를 두 번하고 있습니다. 이것은 정의되지 않은 동작입니다 (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points). 코드를 두 줄로 나누면'j ++ '중 하나를 제거하고 UB를 중단합니다. – computerfreaker

답변

2

이 코드 세그먼트에는 몇 가지 문제가 있습니다. j++가 같은 줄에 두 번 실행중인

while (s2[j]) 
{ 
    s1[j++] = s2[j++]; 
} 

때문에 undefined behavior를 호출하고 있습니다. 당신의 코드를 두 개 더 문제가 있습니다

while (s2[j]) 
    { 
    s1[j] = s2[j]; 
    j++; 
    } 

: 우리는 자신의 라인에 j++를 이동하는 경우 이것은 멀리 갈 것입니다. 먼저 하나의 카운터 (i)를 사용하여 s1의 끝에 도달하지만 s2s1에 추가 할 때는 사용하지 마십시오. 의 그 수 수정 다음 \0s1에 후행 추가 할 때

while (s2[j]) 
    { 
    s1[i] = s2[j]; 
    i++; 
    j++; 
    } 

우리는 같은 일을해야합니다 :

s1[j] = '\0'; 

이된다

s1[i] = '\0'; 

둘째 미성년자 오프로 버그가 i 인 버그. 당신이 정신이를 통해 추적 경우

while (s1[i++]); 

, i++는 루프가 종료 될 때 4에서 i을 가하고, 당신이 원하는 것보다 한 번 더 평가합니다. 그러나이 시점에서 s1에는 asd에 세 개의 문자 만 있습니다. a = 문자 0, s = 문자 1, d = 문자 2. 우리는이 문자보다 한 문자 뒤로 s2을 쓰려고하기 때문에 문자 에서 쓰려고합니다. 모두 함께 넣어, 지금

while (s1[i]) 
{ 
    i++; 
} 

을 : 일치하도록 루프,

while (s1[i++]); 
i--; 

조정 또한 명확성을 위하여이 작업을 수행 할 수

#include <iostream> 

char *strCat(char s1[], char s2[]) 
{ 
    int i = 0, j = 0; 

    while (s1[i]) 
    { 
    i++; 
    } 

    while (s2[j]) 
    { 
    s1[i] = s2[j]; 
    i++; 
    j++; 
    } 

    s1[i] = '\0'; 

    return s1; 
} 

int main() 
{ 
    char t1[10] = "asd"; 
    char t2[] = "fgh"; 
    printf("%s", strCat(t1, t2)); 
} 

그리고 예상대로이 작동합니다.

+0

시간가는 동안 고마워요. –