C 포인터 문학으로 C 기술을 연마 할 때이 코드를 발견했습니다. 이 문제에서는 출력을 정당화해야합니다. 나는 strcat()
과 strcmp()
의 일에 익숙하다. 나는 strcmp()
이 두 문자열이 통과 할 때 0을 반환한다는 것을 알고 있습니다.strcmp() 및 strcat() 시퀀스
# include <stdio.h>
# include <string.h>
int main()
{
static char str1[]="Good";
static char str2[20];
static char str3[20] ="Day";
int l;
l = strcmp(strcat(str3, strcpy(str2, str1)), strcat(str3, "good"));
printf("%d\n", l);
return 0;
}
제공된 대답은 0이며, 이는 계산 된 두 개의 문자열이 동일해야 함을 의미합니다. 저는 여러 단계로 문장을 풀려고했습니다.
먼저 strcat(str3, strcpy(str2, str1))
을 시도했습니다. 'str2'가 'Good'으로 변경되면 strcat()
은 str3
을 'DayGood'로 변경합니다. 내 gcc 컴파일러는 지금까지 나와 동의합니다. STR3 이미 DayGood
로 변경 되었기 때문에
이 strcat(str3, "good")
오는, strcat
는 DayGoodgood
-str3
을 변경합니다.
다시 gcc가 나와 함께 agress.
int main()
{
static char str1[]="Good";
static char str2[20];
static char str3[20] ="Day";
int l;
printf("%s\n", strcat(str3, strcpy(str2, str1)));
printf("%s\n", strcat(str3, "good"));
//l = strcmp(strcat(str3, strcpy(str2, str1)), strcat(str3, "good"));
//printf("%d\n", l);
return 0;
}
내가 다시 변화를 시도
DayGood
DayGoodgood
생산하고 있습니다.
int main()
{
static char str1[]="Good";
static char str2[20];
static char str3[20] ="Day";
int l;
printf("%s\n", strcat(str3, "good"));
printf("%s\n", strcat(str3, strcpy(str2, str1)));
//l = strcmp(strcat(str3, strcpy(str2, str1)), strcat(str3, "good"));
//printf("%d\n", l);
return 0;
}
생성합니다.
Daygood
DaygoodGood
두 경우 모두 비교를 위해 두 개의 다른 문자열을 얻습니다. 왜 strcmp()
은 0을 생성합니까?
모든 종류의 미정도 및 지정되지 않은 모든 동작이 여기 저기에 있어도 안됩니다. –
정의되지 않은 것이 있는지 확실하지 않습니다. 'str3'의 최종 내용은 불특정 평가 순서에 의존적 일 수 있습니다. 그러나 알 수없는 순서의 함수 호출은'x = x ++'만큼 나쁘지 않습니다. 가능한 순서 중 하나가 오버플로 될 것 같지 않습니다. 완충기. 중요한 사실은'str3'은 결국 그 자체와 동일하다는 것입니다. –
@ WumpusQ.Wumbley'str3'의 내용은 시퀀스 포인트 사이에서 두 번 이상 수정됩니다. –