我注意到在实现一个简单的链表列表时,cin
如果输入的值大于max,则不会重新提示。整数的大小。例如:
int input;
do {
cin >> input;
if (input == -1)
break;
else if (input == 0)
pop();
else
push(input);
} while (input != -1);
如果我输入的数字超过int
的数字,将永远循环(请注意input
的类型为int
)。
这可能是迄今为止我遇到的一个相对完全孤立的C ++程序中最危险的行为,在我用这种语言编程的短时间内。因为循环在每次迭代时都推动了输入,所以我的程序的内存使用量在不到30秒的时间内急剧增加到超过1GB ......我的计算机几乎崩溃了。
所以我想知道:为什么cin
会表现出这种行为?
P.S。我通过在读取输入之前添加input = -1
来解决这个无限循环问题。这是阻止循环的最佳方法吗?
答案 0 :(得分:3)
你的循环应该在读取之后检查cin
的状态。如果设置了failbit,则输入操作失败。之后你可以重新提示。
,例如if (!cin) { ... }
答案 1 :(得分:2)
我会考虑像这样重写:
int input;
while(!(std::cin >> input)) {
cout << "you entered in the wrong type, please try again" << endl;
cin.clear();// clear error flags from cin
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //extracts characters from the stream and discards them until a newline is found
}
if(input == 0){
pop();
}else{
push(input);
}
请注意,输入大于允许的最大值int
的值将导致cin
的失败位置位。此解决方案依赖于此行为。
答案 2 :(得分:0)
如果超过最大值,则有符号整数类型就会回滚。
要抵消它,你应该只将输入推送到堆栈中,如果它在可接受的范围内