이 코드 세그먼트에는 몇 가지 문제가 있습니다. j++
가 같은 줄에 두 번 실행중인
while (s2[j])
{
s1[j++] = s2[j++];
}
때문에 undefined behavior를 호출하고 있습니다. 당신의 코드를 두 개 더 문제가 있습니다
while (s2[j])
{
s1[j] = s2[j];
j++;
}
: 우리는 자신의 라인에 j++
를 이동하는 경우 이것은 멀리 갈 것입니다. 먼저 하나의 카운터 (i
)를 사용하여 s1
의 끝에 도달하지만 s2
을 s1
에 추가 할 때는 사용하지 마십시오. 의 그 수 수정 다음 \0
s1
에 후행 추가 할 때
이
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));
}
그리고 예상대로이 작동합니다.
's1 [j ++] = s2 [j ++];'* *. 여기에 정의되지 않은 동작이 호출됩니다. 한 줄에'j ++', 다른 줄에's1 [j] = s2 [j]'를하십시오. – computerfreaker
@computerfreaker하지만 같은 것은 아닌가요? 어쨌든, 나는 변화를 만들었지 만, 결과로 나는 "asdfgh"가 아니라 "fgh"을 얻었다. 뭐가 잘못 됐니? –
사실 전혀 같은 것이 아닙니다. 같은 줄에서'j ++ '를 두 번하고 있습니다. 이것은 정의되지 않은 동작입니다 (http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points). 코드를 두 줄로 나누면'j ++ '중 하나를 제거하고 UB를 중단합니다. – computerfreaker