是cin.clear()和cin.ignore()之间必需的序列?

时间:2016-04-12 18:41:39

标签: c++ infinite-loop iostream cin

首先让我告诉你我的来源。

#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()之间的序列是必需的。 如果是的话,我想知道它为什么需要序列。

请阅读我的问题。对于你的任何回复,我将非常感激。 对不起写作。

2 个答案:

答案 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}}将按预期工作。