在我通过 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 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;
}

10-08 08:48