【问题标题】:cin infinite loop when reading in a non-numeric value读取非数值时的 cin 无限循环
【发布时间】:2015-04-07 11:13:02
【问题描述】:

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

#include <iostream>

using namespace std;

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

【问题讨论】:

标签: c++ iostream infinite-loop cin


【解决方案1】:

程序通过打印零的无限循环运行,我猜这就是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.

【讨论】:

    【解决方案2】:

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

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 2019-11-25
      • 2021-06-27
      相关资源
      最近更新 更多