如果输入值超过目标类型大小,为什么cin不会重新提示?

时间:2014-01-18 07:04:32

标签: c++ cin

我注意到在实现一个简单的链表列表时,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来解决这个无限循环问题。这是阻止循环的最佳方法吗?

3 个答案:

答案 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)

如果超过最大值,则有符号整数类型就会回滚。

要抵消它,你应该只将输入推送到堆栈中,如果它在可接受的范围内