Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么';如果输入值超过目标类型大小,是否重新提示?_C++_Cin - Fatal编程技术网

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,等等上的意外双关语“有点混淆”表示抱歉:)