【发布时间】:2015-09-22 23:24:27
【问题描述】:
我正在尝试学习 C++,但由于一些我无法理解的 cin 行为而陷入了困境。这是我的代码:
#include <iostream>
using namespace std;
int main()
{
int num;
// Get valid input
do
{
if (!cin)
{
// Clear error state and flush any garbage input
cin.clear();
cin.ignore(numeric_limits<streamsize>::max());
}
cout << "Please enter a number: ";
cin >> num;
} while (!cin);
// Echo back what we heard
cout << "You entered: " << num << "\n";
cin.get();
}
这里的问题是,当我第一次输入无效输入(例如一些字母字符)时,程序会卡在 cin.ignore(numeric_limits<streamsize>::max()) 语句上。我可以继续输入内容(包括换行符),但程序永远不会超过该语句。
据我了解,这表明如果 cin.ignore 的第一个参数超过缓冲区的当前大小,那么任何未来的字符(直到提供的限制)都将继续被丢弃。这个对吗?如果正确的话,如何在不影响以后输入的情况下清空输入缓冲区?
注意:由于某种原因,使用cin.ignore(numeric_limits<streamsize>::max(), '\n'),并在cin >> num 之后添加cin.ignore() 会使代码正常工作。这只是为了澄清我知道这种可能性存在,但我仍然有兴趣了解上面代码中出了什么问题(未指定 \n 分隔符)。
【问题讨论】:
-
您将无限期地丢弃字符(很多),直到达到
max()限制或找到 EOF。 -
@MarcoA。假设我输入了
sdqwd而不是数字。缓冲区现在处于失败状态,其中有 6 个字符(我的垃圾和换行符)。一旦ignore删除所有这些,它不会命中EOF吗? -
不,当你输入文件结束符时(通常是Ctrl-Z)
-
@MarcoA。啊,所以我误解了输入流何时结束。那么如何清除缓冲区中的内容呢?
-
您使用 ignore 刷新缓冲区,但由于您输入的是数字(并且使用了换行符),因此您应该丢弃直到找到换行符。
clear()只会重置错误标志