【问题标题】:strcpy() unusual behaviour in CC 中的 strcpy() 异常行为
【发布时间】:2021-08-28 22:19:41
【问题描述】:

所以我决定在阅读 Linux 程序员手册的同时测试 strcpy() 的工作原理。我遇到了strcpy的定义

字符串不能重叠,目标字符串 dest 必须是 大到可以接收副本。

因此,我可能会同意目标字符串的大小应该等于或大于源字符串。 但是当我尝试在 CLion 中运行以下程序时,我得到了一个粉碎堆栈错误

#include <stdio.h> 
#include <string.h>
int main()
{  
   char str1[7], str2[3] = "Hiy";
   strcpy(str1, str2);
   printf("%s", str1);
}

这里 str1 的大小远远超过 str2 的大小。在理想情况下,strcpy 应该将“Hiy”复制到 str1,然后打印功能应该显示“Hiy”,但我仍然得到相同的粉碎堆叠错误。
我认为这可能与 str2 没有空字符有关(因为我已经用字符填充了整个字符数组)但我不确定。关于为什么这不起作用的任何想法?

【问题讨论】:

  • “我仍然收到错误消息。”哪一个?请引用/展示效果并将其与您的期望进行对比。
  • @Yunnosch ok 将编辑
  • 请解释您希望srtcpy() 如何确定源字符串的长度,以停止复制。
  • str2[3] = "Hiy"; 您没有为字符串分配足够的空间。 str只能存储最多2个字符的字符串
  • 如果你尝试printf("&lt;%s&gt;", str2); printf("&lt;%s&gt;", str1);会发生什么?

标签: c c-strings strcpy


【解决方案1】:

由于空字符附加在字符串的末尾,因此您无法存储 str2[3] = "Hiy"; 因为数组 str2 只有 3 个插槽,而您的字符串有 4 个字符,包括末尾的空字符串 char。将其替换为 str2[4] = "Hiy"; 然后你就可以得到你想要的输出。

【讨论】:

  • 谢谢你的工作。我现在明白我的错误了。
  • 它编译并存储三个字符,没有结尾的\0,所以str2只是一个三个字符的数组,不是一个有效的C字符串。
  • 也值得关注strncpy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多