C++:为什么为"int"变量输入"char"会导致递归变得疯狂?

C++: Why does inputting a "char" for an "int" variable cause recursion to go crazy?

本文关键字:递归 疯狂 char 为什么 int 输入 变量 C++      更新时间:2023-10-16

为了练习C++输入和输出的效果,我写了一小段代码。我想知道为什么它的行为会像它一样。

//A Stupid Program
#include <iostream>
using namespace std;
int main()
{
int x;
cout << "please enter a numero: "; cin >> x;
main();
}

运行代码会询问用户"请输入数字:_",并在输入数字时重复。这可以是任何整数。典型输出如下所示:

Please enter a numero: 1
Please enter a numero: 1
Please enter a numero: 152
Please enter a numero: 2
etc...

但是,如果您输入 int 以外的任何内容,递归循环就会变得疯狂并开始打印"请输入数字:"而不要求输入。它看起来像这样:

please enter a numero: H please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: please enter a numero: etc...

然后程序停止工作并返回 -1073741571。

所以这就是我想要帮助的:为什么程序在输入非 int 时不等待输入,为什么它会返回 -1073741571?

谢谢你的帮助。

事实上,

你把main放在一边(你可以把所有内容提取到一个单独的函数中),问题是当你输入流无法解析的东西时,它会进入一个错误状态,它立即从每个操作返回而不做任何事情。您需要检查错误状态并重置流以摆脱这种情况。

试试这个:

int main()
{
   while(1)
   {
      int x;
      cout << "please enter a numero: "; cin >> x;
      if (cin.fail())
      {
         cout << "Please enter integer value! " << endl;
         cin.clear();
         cin.ignore(INT_MAX, 'n');
      }
   }
   return 0;
}

无限循环的原因:
cin进入失败状态,这使得它忽略对它的进一步调用,直到重置错误标志和缓冲区。
为了避免它,请执行以下操作:

int x = 0;
    while(!(cin >> x)){
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cout << "Invalid input.  Try again: ";
    }
    cout << "You enterd: " << x << endl;