清空C++中的cin输入流

4

可能是重复问题:
为什么cin读取被卡住了?

我重载了istream运算符(istream&operator>>...),它接受格式为Point的输入:

(<x-coordinate>,<y-coordinate>)

我想多次(10次)测试这个,因此我写了以下代码:

我想多次(10次)测试这个,因此我写了以下代码:

for (int i = 0; i < 10; i++)  {
    cin >> a;
    if (!cin.fail()) { cout << a << endl; }
    else { cout << "Invalid input!" << endl; cin.clear(); }
}

编辑:

我现在有以下代码:

for (int i = 0; i < 10; i++)  {
    cin >> a;
    if (!cin.fail()) { cout << a << endl; }
    else {
        cout << "Invalid input!" << endl; cin.clear();
        while (!cin.eof()) { cin.ignore(); } cin.ignore();
    }
}

忽略操作是由克苏鲁建议的。然而,问题在于在运行上述代码后,cin仍然输出"无效输入!"。
(3,3) <-- input
(3,3) <-- output
Invalid output! <-- second output

有没有一种方法可以清除cin中的内容?

3
cin.clear() 清除的是标志位,而不是内容。你需要使用 ignore - chris
遗憾的是,“jammed”不是我会搜索的词,而且tl;dr。 :) - Supervisor
1
“tl;dr”不是对有帮助的答案的好回复。 - nothrow
@主管:如果你觉得之前关于这个话题的材料太长而不想读,那么你的问题对我来说也太长了,我不想回答。 - Lightness Races in Orbit
抱歉,本。没有任何不敬之意。:'( - Supervisor
1个回答

2

cin.clear()并不会清空缓冲区,它只是重置流上的错误标志。然后您需要调用cin.ignore

istream&  ignore ( streamsize n = 1, int delim = EOF );

从输入序列中提取字符并将其丢弃。

当已经提取并丢弃了n个字符或者找到了字符delim时,提取过程结束,以先出现的为准。在后一种情况下,delim字符本身也会被提取。


cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

数字极限


我用cin.ignore()替换了cin.clear(),并得到了相同的结果。 - Supervisor
1
你需要同时进行两个步骤。并且使用正确的参数调用 cin.clear 函数。这个函数需要清除一定数量的缓冲字符,并在指定的分隔符处停止清除。 - Anirudh Ramanathan
即使加上以下代码: cin.clear(); cin.ignore(std::numeric_limits::max(), '\n');仍然会有一个"Invalid input!"的输出。我将使用一个布尔值来跟踪它是否进入了else语句并手动跳过"\n"。感谢您的帮助。 - Supervisor
输出仍然相同吗? - Anirudh Ramanathan
它是:(3,3) (3,3) 无效输入! - Supervisor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接