c++ - 如何清除输入流缓冲区
问题描述
我需要从输入中获取一个整数。我写了代码:
int price;
srand((unsigned)time(NULL));
price = rand() % 1000 + 1;
int i;
cout << "Please guess the price(1--1000):" << endl;
cin >> i;
while (cin.fail()) {
cerr << "error"<<endl;
fflush(stdin);
//cin.clear();
//cin.ignore(numeric_limits<std::streamsize>::max());
//cin.get();
cin >> i;
}
我尝试了很多方法,但是如果我输入一个字符e
,结果是:
e
error
error
error
error
error
error
error
error
error
error
error
error
error
error
error
error
error
error
我很困惑,谢谢你的帮助。
解决方案
当用户输入除整数以外的内容时,thencin.fail()
将返回true,while 循环将无限期地继续,并出现您在控制台窗口中看到的消息错误。
但是,当您使用cin.clear();
它时,会清除cin
. 这样未来的输入就会起作用。cin.clear()
将状态恢复到goodbit。
此外,您甚至不必cin.fail()
在您的情况下使用。
你可以这样做:
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int price;
srand((unsigned)time(NULL));
price = rand() % 1000 + 1;
int i;
cout << "Please guess the price(1--1000):" << endl;
cin >> i;
while (!(cin >> i))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Please guess the price(1--1000):";
}
return 0;
}
推荐阅读
- sql - 自然连接语法
- javascript - typescript parseInt 未按预期工作,接收 NaN
- ssl - 从秘密创建 OpenShift TLS 路由
- angular - 离子相机:没有名称的表单控件的值访问器
- java - Java - 带有冲突正则表达式的 string.split
- jsonschema - 如何使用 JSON Schema 有条件地指定默认值
- c# - Powershell addscript和从C#调用不在命令行上显示结果
- java - 尝试使用反射获取对字段的引用时出现 IllegalArgumentException
- javascript - 页面加载时在 Javascript/Jquery 中对引导模态体元素进行排序
- c++ - 位摆弄:否定一个int,只有当它是负数时