在我通过 C 指针文献磨练我的 C 技能的过程中,我遇到了这段代码。在这个问题中,我应该证明输出是合理的。我熟悉 strcat()
和 strcmp()
的工作。我知道当两个字符串通过时 strcmp()
返回 0,是相同的。
# 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 编译器与我一致。
来到
strcat(str3, "good")
,因为 str3 已经更改为 DayGood
, strcat
将 str3
更改为 DayGoodgood
。再次,gcc agress with 我。
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 ? 最佳答案
有一种无需跟踪所有调用即可快速获得答案的方法:strcat
的两个参数均从 strcpy
返回,第一个参数为 str3
,并且由于 strcpy
返回其第一个参数,这意味着最终调用是 strcmp(str3, str3)
0 无论对它做了什么奇怪的操作。
针对更新后的问题,试试这个,看看你是否有所启发:
#include <stdio.h>
#include <string.h>
int main(void)
{
static char str1[]="Good";
static char str2[20];
static char str3[20] ="Day";
char *first, *second;
printf("str3 = %p => %s\n", (void *)str3, str3);
first = strcat(str3, strcpy(str2, str1));
printf("first strcat returned %p => %s\n", (void *)first, first);
printf("and now str3 = %p => %s\n", (void *)str3, str3);
second = strcat(str3, "good");
printf("second strcat returned %p => %s\n", (void *)second, second);
printf("and now first = %p => %s\n", (void *)first, first);
printf("and now str3 = %p => %s\n", (void *)str3, str3);
printf("Is it any surprise that strcmp(first,second) = %d?\n",
strcmp(first,second));
return 0;
}