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

Strange behaviour when implementing strcat in C

我正在尝试自己实现 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 == '[=12=]') print something,发现*tmp == '[=13=]'是真的。

但我很确定 tmp 是一个非空字符串,所以 *tmp 应该指向字符串的第一个字符(我认为)。所以我对此感到困惑。谁能告诉我为什么会这样,我该如何解决?

编辑: 调用代码为

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

path 是从命令中读取的 const char*。 我需要将值分配回子路径吗?或者只调用 my_strcat 就足够了?

这里有两个问题:

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

你想要这样的东西:

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!