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

如何两次使用!(cin>>a)实现C++输入类型合法性校验?

问题原因

当cin输入类型不匹配触发失败时,会同时做两个操作:

  1. 将流的failbit错误状态位置为1,后续所有读操作都会直接失败,直到状态被重置
  2. 导致输入失败的非法数据会保留在输入缓冲区中不会被自动丢弃

你只调用了cin.clear()仅重置了错误状态位,缓冲区里的非法数据还留在原地,第二次对arr2做输入校验时,cin会直接读取这些残留的非法数据,再次触发输入失败,看起来就像跳过了用户输入直接执行了错误分支。

解决方法

每次输入失败执行cin.clear()后,额外调用cin.ignore()清空缓冲区残留的非法数据即可,标准写法如下:

// 重置流错误状态
cin.clear();
// 清空输入缓冲区中直到换行符为止的所有内容
// 需要先引入<limits>头文件才能使用numeric_limits
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
完整可运行示例
#include <iostream>
#include <limits>
using namespace std;

int main() {
    const int ARR_LEN = 3;
    int arr1[ARR_LEN], arr2[ARR_LEN];

    cout << "请输入arr1的" << ARR_LEN << "个整数:" << endl;
    for (int i = 0; i < ARR_LEN; i++) {
        if (!(cin >> arr1[i])) {
            cout << "arr1输入非整数,停止写入" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            break;
        }
    }

    cout << "请输入arr2的" << ARR_LEN << "个整数:" << endl;
    for (int i = 0; i < ARR_LEN; i++) {
        if (!(cin >> arr2[i])) {
            cout << "arr2输入非整数,停止写入" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            break;
        }
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:36:04