C语言去除字符串空格:为何空格后的内容被一并移除?
问题原因分析
你的代码出现输出截断的问题,核心有两个原因:
- 索引错位:你用同一个循环变量
i同时遍历输入字符串和写入输出字符串。遇到空格时,你跳过写入但i仍在递增,导致WORLD的字符被写到输出字符串的第6位及以后,而输出字符串的第5位(对应原输入的空格位置)是未初始化的垃圾值,大概率是'\0',打印时会在HELLO后直接截断。 - 缺少字符串终止符+内存分配错误:C语言字符串必须以
'\0'结尾才能被正确识别,你既没手动添加这个终止符,malloc的大小也只是原字符串长度,没留额外字节存'\0';另外原字符串包含空格,实际需要的内存应该是非空格字符数+1,用原长度分配不仅浪费内存,还会因缺少终止符引发未定义行为。
修正后的代码
char *no_space(const char *str_in) { // 统计非空格字符数量 int non_space_count = 0; for (int i = 0; str_in[i] != '\0'; i++) { if (str_in[i] != ' ') { non_space_count++; } } // 分配内存:非空格字符数 + 1(用于存'\0') char *noSpace_str = malloc((non_space_count + 1) * sizeof(char)); if (noSpace_str == NULL) { // 检查内存分配是否成功 return NULL; } // 用独立索引控制输出字符串的写入位置 int idx = 0; for (int i = 0; str_in[i] != '\0'; i++) { if (str_in[i] != ' ') { noSpace_str[idx++] = str_in[i]; } } noSpace_str[idx] = '\0'; // 添加字符串终止符 return noSpace_str; }
关键修正说明
- 新增非空格字符统计:确保内存分配大小刚好够用,避免浪费。
- 使用独立的
idx变量:遇到空格时idx不递增,保证有效字符连续写入输出字符串。 - 添加
'\0'终止符:让返回的字符串符合C语言字符串规范。 - 增加
malloc空指针检查:避免内存分配失败后操作空指针,是C语言动态内存操作的良好习惯。
内容的提问来源于stack exchange,提问作者odradek
相关产品推荐
相关产品推荐

