在使用 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 与我发生冲突。
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
返回它的第一个 arg,这意味着最终调用是 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;
}
关于c - strcmp() 和 strcat() 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17902711/