如何两次使用!(cin>>a)实现C++输入类型合法性校验?
问题原因
当cin输入类型不匹配触发失败时,会同时做两个操作:
- 将流的
failbit错误状态位置为1,后续所有读操作都会直接失败,直到状态被重置 - 导致输入失败的非法数据会保留在输入缓冲区中不会被自动丢弃
你只调用了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
相关产品推荐
相关产品推荐

