【问题标题】:is sequence necessary between cin.clear() and cin.ignore()?cin.clear() 和 cin.ignore() 之间是否需要序列?
【发布时间】:2016-08-03 13:14:18
【问题描述】:

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

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

谢谢阅读我的问题。对于您的任何回复,我将不胜感激。 很抱歉写的口齿不清。

【问题讨论】:

    标签: c++ infinite-loop iostream cin


    【解决方案1】:

    我们一步一步看第二个sn-p:

    if (cin.fail()) { 
    

    如果我们输入这个,流已经很糟糕了。所以输入操作

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    立即失败并且什么也不做。因此,在

    cin.clear();
    

    垃圾输入仍在流中并导致

    cin >> n;
    

    再次失败,甚至没有等待输入,这让我们回到了起点。

    如果你交换调用(就像在第一个 sn-p 中一样),clear 将使流再次“好”,然后ignore 成功摆脱垃圾输入,cin &gt;&gt; n; 将按预期工作。

    【讨论】:

    • 哇,我明白了。现在我知道为什么了。 Thx!那么,如果 cin.failbit 已设置,则 cin.ignore(numeric_limits::max(), '\n') 不起作用,对吧?
    • @ChingChangeatthebaby 没错,毕竟也是输入功能。
    【解决方案2】:

    虽然 cin.fail() 为真,但任何从流中读取的尝试都将 - 嗯 - 失败。

    调用cin.clear() 会从流中删除失败标志,从而再次启用输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 2017-06-07
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多