关于 strcat(s,t) 将字符串 t 复制到 s 末尾的有趣问题

interesting question about strcat(s,t) copies the string t to the end of s

void StrcatStr(char *s, char *t) {
    while (*s++ != '[=10=]');
    while ((*s++ = *t++) != '[=10=]');
}
int main() {
    char str1[] = "abcd";
    char str2[] = "sss";
    StrcatStr(str1, str2);
    printf("%s", str1);
    return 0;
}

起初,我发现指针s指向字符'a',但接下来它指向了字符串中的无效字符。最后,系统告诉我变量 str1 周围的堆栈已损坏。为什么会发生这件事?指针 s 不应该指向下一个字符 'b' 吗?

定义

char str1[] = "abcd";

等同于

char str1[5] = { 'a', 'b', 'c', 'd', '[=11=]' };

这意味着数组将只有五个元素。数组不是动态的,定义后不能扩展。

因此,将此用作任何 strcat 类函数的目标将写入 越界 并给你 未定义的行为 .

您需要确保数组中有足够的 space 来容纳两个字符串,例如通过设置明确的大小(已知足够):

// 30 should be more than enough to fit two 4-character strings plus the terminator
char str1[30] = "abcd";

这里的问题是第一个,你应该写*(++s)而不是*s++。使用 s++ 你实际上是在 return 中给出 s 的当前值然后递增 is 值,当你到达 '\0' 时会发生什么? s -> '\0',while 循环中的条件现在为假,但您仍在递增该值!!所以你不是指向 '\0' 字符,而是指向它前面的 1 个字符。当您修改字符串中的字节时,您是第二个,并且考虑到仍然存在“\0”,printf 不会显示第二个字符串。 使用 (++s) 你首先增加 return 新值,这样你就可以在第一个字符串的末尾停止,注意当你的第一个字符串没有字符时你应该在单独的情况下处理它.