strcmp()和strcat()序列

时间:2013-07-27 21:39:46

标签: c string pointers

在使用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已经更改为DayGoodstrcatstr3更改为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?

6 个答案:

答案 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,这就是原因!