You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

char数组最后一次迭代复制整词而非单个字符的调试问题

解决char数组最后一次迭代复制整个单词的问题

兄弟,我太懂这种踩坑的憋屈感了!你遇到的这个问题**99%是因为char数组作为字符串使用时,没有正确添加终止符'\0'**导致的。

你提到第三次迭代后结果是htak,第四次迭代后变成htakohtako,而且单独打印c1[i]是正常的o——这说明单个字符的复制逻辑完全没问题,但当你把这个char数组当作字符串输出(或用字符串操作函数处理)时,C语言会从数组起始地址一直读取内存,直到碰到'\0'才会停止。如果你的目标数组里没有这个终止符,程序就会越界读取内存里的后续数据,刚好你之前的字符串htako可能在内存里挨着目标数组,就被额外读出来了,所以才会出现htakohtako的诡异结果。

举个例子,你大概率写了类似这样的错误代码:

char c1[] = "htako";
// 只分配了和源字符串长度一致的空间,没留'\0'的位置
char target[5]; 

for (int i = 0; i < 5; i++) {
    target[i] = c1[i];
}
// 这里printf会越界读取内存,输出异常内容
printf("%s", target);

给你三个直接有效的解决方案:

  • 给目标数组预留足够空间:目标数组的大小要比源字符串的长度多1,用来存放终止符'\0'。比如源字符串长度是5,目标数组至少要定义成char target[6];
  • 手动添加终止符:在循环复制完所有字符后,一定要给目标数组的最后一个位置赋值'\0',示例代码:
    target[5] = '\0';
    
  • 检查源字符串合法性:确保你的源字符串c1本身是以'\0'结尾的(用双引号定义的字符串默认会自动添加,除非你手动初始化char数组时刻意省略)

按照上面的方法修正后,再运行程序,输出就会是正常的htako,不会再出现额外的重复内容了。

内容的提问来源于stack exchange,提问作者Omar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:49:27