读取非数字值时的无限循环

时间:2015-02-07 09:33:08

标签: c++ iostream infinite-loop cin

我在一个程序中有一个奇怪的行为,我花了很长时间试图推断出原因。这是一个没有意义的无限循环。测试这些代码行(怀疑)我得到了相同的结果。每次我输入一个非数字值这样的符号,程序运行无限循环打印零,我猜是cout如何表示输入的错误值。我想知道为什么来自cin的奇怪行为,打印所有这些零而不是在找到错误的读数时停止。

#include <iostream>

using namespace std;

int main()
{
    int n = 0;
    while(n >= 0) {
        cin >> n;
        cout << n << endl;
        }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

  

程序运行无限循环打印零,我猜是cout表示输入错误值的方式。

这不是很正确:当您向cin询问int但没有int时,您没有得到任何值,但无效输入仍保留在缓冲区中。当你在循环的下一次迭代中再次请求int时,同样的事情再次发生,并且没有进展:错误的数据仍然存在于缓冲区中。

这就是你获得无限循环的原因。要解决此问题,您需要添加一些代码以从输入缓冲区中删除错误数据。例如,您可以将其读入字符串,并忽略输入:

int n = 0;
while(n <= 0) {
    cin >> n;
    if (!cin.good()) {
        cin.clear();
        string ignore;
        cin >> ignore;
        continue;
    }
    cout << n << endl;
}

Demo.

答案 1 :(得分:1)

你需要“吃掉”非数字输入,即

#include <iostream>

using namespace std;

int main()
{
    int n = 0;
    while(n >= 0) {
        cin >> n;
        if (!cin) {
           char c;
           cin >> c;
        } else {
            cout << n << endl;
        }
    }
    return 0;
}