scanf/cin 卡在循环中

scanf/cin is stucks in loop

我有一个 C++ 程序可以对给定大小的数组执行计算。它在小数组上工作正常,但在大数组上,scanf 和 cin 卡住了,如果我输入任何非数字,它就会跳出评估错误计算的循环。

编辑:如果我将输入分成多行,那么它就可以工作。那么如何增加我的OS(即Linux)

的行长度限制

这里是重现问题的示例代码:-

#include <iostream>

using namespace std;
int main() {
    int N;

    cin >> N;
    int *X = new int[N];

    for(int i=0;i<N;i++){
        cout << "getting " << i << "th input \n";
        cin >> X[i]; // tried scanf too but i
    }

    cout << "Done\n";

    return 0;
}

当我像这样给出大量输入时:- https://pastebin.com/PWmm9J7i

它打印到

getting 693th input

我 运行 多次编程,仍然得到相同的结果。我还用 clang 和 gcc 编译了它,但它仍然停留在第 693 个输入。

我正在使用 Manjaro OS 和 ZSH shell

首先,您链接到的示例运行良好。但是你说:cin 卡住了,如果我输入任何非数字。这是预期的行为。要处理这个问题,您需要检查 cin 的状态,如果它处于错误状态,请清除错误并使用错误字符:

for (int i = 0; i < N; i++){
    cout << "getting " << i << "th input \n";
    if (!(cin >> X[i])) {
        // No more input?
        if (cin.eof()) break;
        // Clear error
        std::cin.clear(); 
        // Consume all input until next space
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
        // You probably also want to decrement i
        i--;
    }
}

我发现它与 Canonical Mode Input Processing 有关。 可以找到更多信息 here

您可以使用 stty cbreakstty -icanon

关闭规范模式

我正在使用 Zsh shell,所以我链接的网站上的答案对我不起作用。他们确实为 bash shell 工作。现在,我正在使用这种技术将输入提供给程序:-

./program < input.txt

这是 cin 的预期错误

int i;
cin>>i;
if(cin.fail()) {
//error handling here
}