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

如何清除cin输入缓冲区?捕获异常后程序仍无法正常运行

问题分析与解决

你的核心问题有两个:

  • cin.clear的用法完全错误,它的作用是清除流的错误状态位,而非直接操作缓冲区内容
  • 捕获异常后仅清除状态位还不够,必须清空输入缓冲区里的错误数据,否则下一次读取会重复触发异常

错误点拆解

  1. cin.clear(80, '\n')是错误用法:cin.clear的参数是流状态标志(比如ios::goodbit),默认不传参就是清除所有错误状态,你写的参数完全不符合函数要求,导致错误状态没有被正确重置。
  2. 未清空输入缓冲区:当输入非数字内容触发failbit后,错误的输入内容还留在缓冲区里,下一次cin >> inputName会直接读取这些错误内容,再次触发异常,导致程序停滞。

修正后的完整代码

#include <iostream>
#include <string>
#include <limits> // 需要包含这个头文件来使用numeric_limits

using namespace std;

int main() {
    string inputName;
    int age;
    // 设置cin的异常掩码,仅当failbit触发时抛出异常
    cin.exceptions(ios::failbit);

    cin >> inputName;
    while (inputName != "-1") {
        try
        {
            cin >> age;
            cout << inputName << " " << (age + 1) << endl;
        }
        catch (ios_base::failure& excpt)
        {
            age = 0;
            cout << inputName << " " << age << endl;
            // 清除cin的错误状态位,恢复流的可用状态
            cin.clear();
            // 忽略缓冲区中所有剩余字符直到换行符,彻底清空错误输入
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }

        inputName = "";
        cin >> inputName;
    }

    return 0;
}

关键修正说明

  • cin.clear():重置流的错误状态,让cin回到可读取状态
  • cin.ignore(numeric_limits<streamsize>::max(), '\n'):numeric_limits<streamsize>::max()表示忽略尽可能多的字符,直到遇到换行符为止,这样能把缓冲区里的错误输入完全清空,避免下一次读取触发异常

内容的提问来源于stack exchange,提问作者SeeLamb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:05:21