c++ - 当接收到无效输入时,为什么while(true)会跳过cin?
问题描述
在接收到错误输入(非整数)后,此 while 循环不会等待来自 cin 的输入。cin 是否以某种方式保持虚假状态?
while (true) {
int x {0};
cout << "> ";
cin >> x;
cout << "= " << x << endl;
}
我希望这个while循环每次都等待输入,但是当它接收到错误的输入时不再发生这种情况。
解决方案
一旦cin
失败,它将保持无效状态,直到被清除。
不带参数的clear()可用于在意外输入后取消设置故障位
通过为它们分配状态值来设置流错误状态标志。默认情况下,分配 std::ios_base::goodbit 具有清除所有错误状态标志的效果。
正如@Peter指出的那样,您还必须清除缓冲区。
你的例子是这样的:
while (true) {
int x{0};
cout << "> ";
if (!cin) {
// unset failbit
cin.clear();
// clear the buffer
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
cin >> x;
cout << "= " << x << endl;
}
推荐阅读
- javascript - 检测用户是否点击了 6 个 div id 元素中的任何一个
- reactjs - 使用 laravel api 从 react 上传图片
- r - R - 根据列名和行名提取子矩阵
- android - Android 与 Ubuntu 的蓝牙串行通信
- javascript - 尝试在 anular 上实现 jquery 时未定义 $
- javascript - 为什么 appendChild 会根据元素的顺序发生变化?
- c# - 为什么我在 C# 的 Nuget BigInteger 1.0.7 中出现 System.ArithmeticException?
- reactjs - Apollo 本地状态 - 如何通过 id 查询
- css - Flexbox:让项目扩展以填充行
- node.js - Webpack 开发服务器 PFX 配置