C++ 为什么';如果输入值超过目标类型大小,是否重新提示?
我注意到,当我实现一个简单的链表堆栈时,C++ 为什么';如果输入值超过目标类型大小,是否重新提示?,c++,cin,C++,Cin,我注意到,当我实现一个简单的链表堆栈时,cin在我输入的值大于整数的最大值时不会重新提示。例如: int input; do { cin >> input; if (input == -1) break; else if (input == 0) pop(); else push(input); } while (input != -1); 如果我输入的数字超过了int(注意input的类型是int),
cin
在我输入的值大于整数的最大值时不会重新提示。例如:
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
为什么会表现出这种行为
另外,我通过在读取输入之前添加
input=-1
解决了这个无限循环问题。这是防止循环的最佳方法吗?有符号整数类型如果超过其最大值,只需环绕
为了抵消它,只有当输入在可接受的范围内时,才应将其推送到堆栈中有符号整数类型如果超过了它们的最大值,则只需换行即可
要抵消它,您只应将输入推到堆栈中,如果它在可接受的范围内您的循环应该在读取之后检查
cin
的状态。如果设置了故障位,则输入操作失败。你可以在那之后重新提示
例如,
if(!cin){…}
您的循环应该在读取后检查cin
的状态。如果设置了故障位,则输入操作失败。你可以在那之后重新提示
< > >代码>如果(.CIN){…} /代码> ,我会考虑重写如下:
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>>输入)){
我会考虑这样的改写:
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>>输入)){
cout Thank@Barmar,没有看到这个问题。我想我的问题也涉及到为什么cin
会这样(或者在链接问题中提到的“失败”状态)?Thank@Barmar,没有看到这个问题。我想我的问题也涉及到为什么cin
会这样(或如链接问题中提到的处于“失败”状态)?好的,failbit是什么?它有点混淆流上的位:failbit、badbit、good(),等等,但是如果你检查cin的值作为bool,你会看到状态是否良好。好的,明白了。谢谢!P.s.对于failbit、badbit等的意外双关语“有点混淆”表示抱歉:)好的,什么是failbit?有点混淆了流上的位:failbit,badbit,good(),等等,但是如果你检查cin作为bool的值,你会看到状态是否良好。好的,明白了。谢谢!P.s.对于failbit,badbit,等等上的意外双关语“有点混淆”表示抱歉:)