cin在读取非数值时无限循环

cin infinite loop when reading in a non-numeric value

本文关键字:无限循环 读取 cin      更新时间:2023-10-16

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

#include <iostream>
using namespace std;
int main()
{
    int n = 0;
    while(n >= 0) {
        cin >> n;
        cout << n << endl;
        }
    return 0;
}

程序运行了一个打印零的无限循环,我想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;
}

演示。

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

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