C语言移除字符串所有空格时循环退出后仍打印多余文本问题
问题原因
你的代码存在两个核心C语言字符串操作错误,打印出多余字符是典型的未定义行为+字符串缺少结束符导致的:
char newStr[] = "";定义的数组长度仅为1字节,只能容纳1个字符串结束符\0。你后续循环中往newStr写入字符时,属于数组越界写操作,会直接覆盖栈上相邻内存存储的原字符串str的数据,属于C标准中明确的未定义行为,运行结果完全不可控。- 循环写入非空格字符后,没有在
newStr的末尾手动添加字符串结束符\0。C语言中所有字符串都必须以\0作为结束标记,printf输出%s格式的字符串时,会从起始地址一直向后读取内存,直到碰到第一个\0才会停止,这就是输出末尾多出无关字符的直接原因。
你测试时发现的两种“可以正常运行”的情况都只是巧合,并没有从根本上解决问题:
- 预先给
newStr设置足够大的固定长度时,只是避免了越界写覆盖其他内存的问题,如果忘记加结束符,依然可能打印出乱码;- 把循环条件改成
i<=strlen(str)时,最后一次循环会读取到原字符串末尾自带的\0,这个字符不是空格,会被写入newStr,刚好补上了缺失的结束符,但如果newStr空间不足,越界问题依然存在,只是刚好当前运行环境下没有触发崩溃而已。
修复后的正确代码
#include <stdio.h> #include <string.h> int main(){ char str[] = " My name is Harry 123 "; // 去空格后的字符串最长不会超过原字符串长度,额外+1字节用来存储结束符\0 char newStr[strlen(str) + 1]; int j = 0; for(int i = 0; i < strlen(str); i++){ if(str[i] != ' '){ newStr[j] = str[i]; j++; } } newStr[j] = '\0'; // 必须手动添加字符串结束符 printf("%s", newStr); return 0; }
修复后运行输出为MynameisHarry123,符合预期。
内容的提问来源于stack exchange,提问作者ipritik
相关产品推荐
相关产品推荐

