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; 将按预期工作。