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
相关产品推荐
相关产品推荐

