[英]Cannot clear Input Stream by cin.ignore() and cin.clear()
[英]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()
為true時,任何從流中讀取的嘗試都會失敗。
調用cin.clear()
會從流中刪除失敗標志,從而再次啟用輸入。
讓我們一步一步看第二個片段:
if (cin.fail()) {
如果我們輸入此內容,則該流已經很糟糕。 所以輸入操作
cin.ignore(numeric_limits<streamsize>::max(), '\n');
立即失敗,什么都不做。 因此,之后
cin.clear();
垃圾輸入仍然在流中並且生成
cin >> n;
再次失敗,甚至沒有等待輸入,這讓我們回到了開始。
如果你交換調用(比如在第一個片段中), clear
將使流再次“好”,然后ignore
成功擺脫垃圾輸入,並且cin >> n;
將按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.