首先让我告诉你我的来源。
#include <iostream>
#include <limits>
using namespace std;
int main() {
int n;
while (true) {
cout << "Type >> ";
cin >> n;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Not a number" << endl;
continue;
}
if (n % 2)
cout << "odd";
else
cout << "even";
cout << endl;
}
return 0;
}
好吧,这段代码可以毫无问题地运行。但是,如果我在cin.clear()和cin.ignore()之间交换,那么输入字符(不是整数),它会陷入无限循环。 (参考下一个代码)
#include <iostream>
#include <limits>
using namespace std;
int main() {
int n;
while (true) {
cout << "Type >> ";
cin >> n;
if (cin.fail()) {
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.clear();
cout << "Not a number" << endl;
continue;
}
if (n % 2)
cout << "odd";
else
cout << "even";
cout << endl;
}
return 0;
}
我想知道cin.clear()和cin.ignore()之间的序列是必需的。 如果是的话,我想知道它为什么需要序列。
请阅读我的问题。对于你的任何回复,我将非常感激。 对不起写作。
答案 0 :(得分:0)
虽然cin.fail()
为真,但任何从流中读取的尝试都会失败。
调用cin.clear()
会从流中删除失败标志,从而再次启用输入。
答案 1 :(得分:0)
让我们一步一步地看第二个片段:
if (cin.fail()) {
如果我们输入此内容,则该流已经很糟糕。所以输入操作
cin.ignore(numeric_limits<streamsize>::max(), '\n');
立即失败,什么都不做。因此,在
之后cin.clear();
垃圾输入仍在流中并生成
cin >> n;
再次失败,甚至没有等待输入,这让我们回到了开始。
如果你交换调用(比如在第一个片段中),clear
将使流再次“好”,然后ignore
成功摆脱垃圾输入,cin >> n;
1}}将按预期工作。