C++去除输入字符串所有空格(无预定义函数)代码异常求排查
问题分析与修正方案
你的代码里有几个关键问题导致输出不符合预期,咱们一步步拆解:
1. 不安全且已废弃的gets()函数
gets(x)是C标准里已经被移除的函数,它不会检查输入长度,很容易导致缓冲区溢出(比如用户输入超过99个字符时),而且不符合现代C++的规范,完全不应该再使用。
2. 违反了“不使用任何预定义函数”的要求
你用到了strlen(x),这是标准库的预定义函数,得自己实现字符串长度的计算逻辑才行。
3. 核心的字符串处理逻辑错误
你的循环逻辑逻辑完全走偏了:当遇到空格时pos递增,然后执行x[i] = x[i+pos],这会导致索引越界,而且无法正确跳过空格。比如原字符串是"a b c",第一个空格出现后pos=1,下一次循环i=1时会把x[2]的字符覆盖到x[1],后续的字符复制会彻底混乱,最终结果自然不对。
4. fflush(stdin)的未定义行为
fflush只对输出流有明确的行为定义,对输入流stdin调用是未定义行为,不同编译器可能有不同表现,绝对不能用来清空输入缓冲区。
修正后的代码(完全符合要求)
#include <iostream> int main() { char x[100]; int i = 0, new_pos = 0; std::cout << "Enter a string: "; // 手动读取输入直到换行或缓冲区满,替代不安全的gets() while (i < 99 && (x[i] = std::cin.get()) != '\n') { i++; } x[i] = '\0'; // 手动添加字符串结束符 // 遍历字符串,跳过空格复制到新位置 for (i = 0; x[i] != '\0'; i++) { if (x[i] != ' ') { x[new_pos] = x[i]; new_pos++; } } x[new_pos] = '\0'; // 给处理后的字符串添加结束符 std::cout << "The final string is: " << x << std::endl; // 安全等待用户输入退出,替代fflush(stdin)的错误用法 std::cout << "Press Enter to exit..."; std::cin.ignore(); // 忽略之前输入留下的换行符 std::cin.get(); return 0; }
代码说明
- 输入处理:用
std::cin.get()循环读取字符,直到换行或缓冲区满,手动添加'\0'作为字符串结束,既避免了gets()的安全问题,也没有依赖预定义输入函数。 - 无预定义函数:通过遍历到
'\0'来判断字符串结束,完全替代了strlen的功能。 - 空格处理逻辑:用两个索引
i(遍历原字符串)和new_pos(指向处理后字符串的当前位置),遇到非空格字符就复制到new_pos的位置,然后new_pos递增,最后手动添加结束符,确保字符串格式正确。 - 安全的退出等待:用
std::cin.ignore()先忽略之前输入留下的换行符,再用std::cin.get()等待用户按回车,彻底避免了fflush(stdin)的未定义行为。
内容的提问来源于stack exchange,提问作者DeBARtha
相关产品推荐
相关产品推荐

