簡體   English   中英

是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()為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM