在使用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?
答案 0 :(得分:3)
有一种快速的方法可以在不追踪所有调用的情况下得到答案:strcat
的两个参数都是从strcpy
返回的,第一个arg str3
,以及{{1}返回它的第一个arg,这意味着最后的调用是strcpy
,无论对它进行了多少奇怪的操作,它当然都是0。
为了回应更新的问题,请尝试这一点,看看你是否得到了启发:
strcmp(str3, str3)
答案 1 :(得分:3)
无论编译器选择哪种顺序来计算strcmp
的参数,strcat
总是返回其第一个参数。
因此,实质上就是这样:
... // execute strcat(str3, strcpy(str2, str1)) and strcat(str3, "good")
l = strcmp(str3, str3);
答案 2 :(得分:2)
它返回0,因为两个参数:
strcat(str3, strcpy(str2, str1))
和
strcat(str3, "good")
实际上返回相同的东西:分配给str3的内存地址。因此,strcmp返回0,因为它将变量str3与自身进行比较。
答案 3 :(得分:1)
strcat
始终返回传递给它的第一个参数的事实使得表达式始终为true。这是解释:
strcmp(strcat(str3, strcpy(str2, str1)), strcat(str3, "good"));
// ^^^^ ^^^^
// become
strcmp( str3, str3 );
所以strcmp
通过将变量与自身进行比较来返回0
。
您应该知道这种表达方式不是很好,因为它使代码不易理解,并且可能导致未定义的行为比您想象的更快...
答案 4 :(得分:1)
strcmp获取两个指向字符串的指针作为其参数:
l = strcmp(strcat(str3, strcpy(str2, str1)), strcat(str3, "good"));
第1步:
l = strcmp(str3, strcat(str3, "good"));
这里str3指向字符串DayGoodgoodGood。
第二步:
l = strcmp(str3,str3 );
现在str3指向字符串DayGoodgoodGoodgood。
无论str3指向什么,都会返回0。由于地址相同,strcmp甚至不应该进行优化比较;只返回0.
答案 5 :(得分:0)
strcat
返回第一个arg,这就是原因!