You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:53:17