gpt4 book ai didi

c - 字符串在 C 中意外移动

转载 作者:行者123 更新时间:2023-12-01 23:20:41 25 4
gpt4 key购买 nike

作为指针练习,我制作了一个字符串连接函数:

void
strcat(char *s, char *t)
{
while(*s)
s++;
while(*s++ = *t++);
}

似乎工作得很好:

main()
{
char *s = "Hello, ";
char *t = "world!";

strcat(s,t);
printf("%s\n", s);

return 0;
}

按预期生成 Hello, world!。但是也发生了一些不想要的事情,打印字符串 t points to gives orld!strcat 无法更改 t。相反,似乎字符串已经移动了;在 strcat 之后递减 t 然后打印它给出正确的字符串。

是什么移动了弦? strcat 必须是它,但不知道它有什么问题。

如果重要的话,在 tcc 版本 0.9.26 (x86-64 Win64) 中编译。

最佳答案

这是未定义的行为:

  • 您正在写入分配给字符串文字的空间,并且
  • 您的书写超出了分配的空间。

为了进行就地连接,目标必须包含足够的空间来容纳连接的结果。修复方法如下:

main()
{
char s[14] = "Hello, "; // 14 is enough to fit Hello, world!\0
char *t = "world!";

strcat(s,t);
printf("%s\n", s);

return 0;
}

注意:您可能想要更改函数的签名以指示第二个字符串未被修改:

void strcat(char *s, const char *t)

关于c - 字符串在 C 中意外移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17051167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com