代码之家  ›  专栏  ›  技术社区  ›  pbbb

在C中实现strcat时的奇怪行为

  •  0
  • pbbb  · 技术社区  · 2 年前

    我正在尝试自己实现strcat功能。这是我的代码:

    char *my_strcat(char *dst, const char* src) {
        char *tmp = dst;
        while(*tmp) {
            tmp ++;
        }
        while(*tmp++ = *src++);
        return dst;
    }
    

    然而,当我尝试测试这个函数时,我只得到src字符串。(即,我希望得到dst+src,但返回值与src相同)

    从代码中可以看出,在第一个while循环中,我试图将tmp指针移动到dst的末尾。 然而

    1. 我试图在第一个while循环中添加printf,但没有打印任何内容,这表明它甚至没有进入循环。

    2. 然后我试着用 if (*tmp == '\0') print something ,并发现 *tmp == '\0' 这是真的。

    但我很确定tmp是一个非空字符串,所以 *tmp 应该指向字符串的第一个字符(我想)。所以我对此感到困惑。有人能告诉我为什么会发生这种情况,我该如何解决它吗?

    编辑: 呼叫代码是

    char *subpath = "";
    subpath = my_strcat(subpath, path);
    

    path 是一个 const char* 阅读命令。 我是否需要将值赋回子路径?或者只是打电话 my_strcat 够了吗?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Jabberwocky    2 年前

    这里有两个问题:

    char *subpath = "";
    subpath = my_strcat(subpath, path);
    
    • 子路径指向长度为0的字符串,没有足够的空间来追加任何内容。
    • 子路径指向字符串文字,而写入字符串文字是未定义的行为,在现代桌面平台上,程序通常会崩溃。

    你想要这样的东西:

    char subpath[100] = "";
    char *foo;
    foo = my_strcat(subpath, path);
    

    或者只是

    char subpath[100] = "";
    my_strcat(subpath, path);
    

    char subpath[100] = "Hello ";
    my_strcat(subpath, "world!");
    printf("%s\n", subpath);  // prints  Helllo World!