cin.clear() 和 cin.ignore() 之间是否需要顺序?
is sequence necessary between cin.clear() and cin.ignore()?
首先让我向您展示我的来源。
#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() 之间是否需要顺序。
如果是,我想知道为什么它需要序列。
感谢阅读我的问题。如果您有任何回复,我将不胜感激。
抱歉文笔不通。
虽然 cin.fail()
为真,但任何从流中读取的尝试都会 - 呃 - 失败。
调用 cin.clear()
从流中删除失败标志,从而再次启用输入。
让我们一步步看第二个片段:
if (cin.fail()) {
如果我们输入这个,流已经很糟糕了。所以输入操作
cin.ignore(numeric_limits<streamsize>::max(), '\n');
立即失败,什么都不做。因此,在
之后
cin.clear();
垃圾输入仍在流中并使
cin >> n;
再次失败,甚至没有等待输入,这让我们回到了起点。
如果交换调用(如第一个片段),clear
将再次使流 "good",然后 ignore
成功摆脱垃圾输入, cin >> n;
将按预期工作。
首先让我向您展示我的来源。
#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() 之间是否需要顺序。 如果是,我想知道为什么它需要序列。
感谢阅读我的问题。如果您有任何回复,我将不胜感激。 抱歉文笔不通。
虽然 cin.fail()
为真,但任何从流中读取的尝试都会 - 呃 - 失败。
调用 cin.clear()
从流中删除失败标志,从而再次启用输入。
让我们一步步看第二个片段:
if (cin.fail()) {
如果我们输入这个,流已经很糟糕了。所以输入操作
cin.ignore(numeric_limits<streamsize>::max(), '\n');
立即失败,什么都不做。因此,在
之后cin.clear();
垃圾输入仍在流中并使
cin >> n;
再次失败,甚至没有等待输入,这让我们回到了起点。
如果交换调用(如第一个片段),clear
将再次使流 "good",然后 ignore
成功摆脱垃圾输入, cin >> n;
将按预期工作。