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 cbreak
或 stty -icanon
关闭规范模式
我正在使用 Zsh shell,所以我链接的网站上的答案对我不起作用。他们确实为 bash shell 工作。现在,我正在使用这种技术将输入提供给程序:-
./program < input.txt
这是 cin 的预期错误
int i;
cin>>i;
if(cin.fail()) {
//error handling here
}
我有一个 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 cbreak
或 stty -icanon
我正在使用 Zsh shell,所以我链接的网站上的答案对我不起作用。他们确实为 bash shell 工作。现在,我正在使用这种技术将输入提供给程序:-
./program < input.txt
这是 cin 的预期错误
int i;
cin>>i;
if(cin.fail()) {
//error handling here
}