c - strcmp() 和 strcat() 序列

标签 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 已经更改为 DayGoodstrcat 更改 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/

相关文章:

c - 能够从未初始化的结构指针数组打印预期结果 - 困惑

c++ - Qt C++ - 删除 QTableWidget 中的行

c++ - 指针动态分配(核心转储)

C:需要帮助从字符串中提取值

python - 打印 0-999999 的号码名称

java - 从字符串中提取占位符

javascript - 删除字符串中第四个斜杠“/”之后的所有字符

c - 在另一个.c中引用队列

c - 如何更改 LLVM IR 中的指令变量?

c - 如何使用 CAP_SYS_ADMIN