C语言移除字符串空格仅输出空格前内容如何解决
问题根因
原代码跑不出预期结果的核心问题是复用源字符串的遍历索引i当目标字符串的写入下标:
- 遍历到空格位置时直接执行
continue,目标字符串对应i的位置根本没赋值,保留了栈上的随机值,这个位置刚好是\0(字符串结束符)的概率极高,printf碰到结束符就直接终止输出,自然只能打出空格前的"hello" - 就算这个位置没随机到结束符,空格后面的字符也全部错位了一个位置,输出肯定不对
- 代码从头到尾没给目标字符串补字符串结束符
\0,本身就带乱码隐患
修正方案
给目标字符串单独维护一个独立的写入下标计数器,只有真的往里面写非空格字符的时候,才把这个下标往后挪一位,整个源串遍历完之后,手动在最后补个\0就行。
修正后的可运行代码:
#include <stdio.h> #include <string.h> int main() { char test1[] = "hello man"; char test2[128]; int write_idx = 0; // 目标字符串专用的写入位置标记 for (int i = 0; i < strlen(test1); i++) { if (test1[i] == ' ') { continue; // 碰到空格只跳过源串的当前字符,写入位置不动 } test2[write_idx] = test1[i]; write_idx++; // 写完一个字符,写入位置往后挪一位 } test2[write_idx] = '\0'; // 这步不能省,必须手动补字符串结束标记 printf("%s\n", test2); return 0; }
编译运行就能正确输出helloman。
踩坑提醒
- 凡是对字符串做增、删字符的操作,都别把源串的遍历索引直接拿来给目标串用,两个串长度不一样的时候,下标错位是必然的
- C语言里的局部字符数组不会自动初始化,也不会在你拷贝完字符后自动补结束符,但凡手动拼字符串,最后一定要加
\0,不然打印的时候会顺着内存一直往后读,带出一堆没意义的乱码
内容的提问来源于stack exchange,提问作者rg_bjj
相关产品推荐
相关产品推荐

