do-while 无限循环与 if c++

do-while infinite loop with if c++

在这个循环中,用户应该输入一个 int 并且程序会检查它是否奇怪它将转到下一部分,但我不明白为什么如果用户输入一个不是 [=11 的字符=], 程序陷入死循环!

int num;
do {
    cout << "PLEASE enter the num: ";
    cin >> num;
    if (num % 2 == 0)
        cout << "Number should be odd!" << endl;
    else
        break;
} while (true);
//...

因为无论如何 char/int != 0 如果它也是 ==0 它应该在下一个 cin 停止但它不会停止! 我也试过 ws(cin) 但它没有帮助我。 请告诉我如何解决这个问题,以及为什么会这样。

因为你的程序没有检查cin >> num;的结果。因为 cin >> num; (其中 num 是一个整数)将读取所有可用的数字,如果输入根本不是数字 [并且不是空白字符,cin >> 会跳过它],然后它不断尝试读取输入。

当用户输入 "askjhrgAERY8IWE" 到您的程序时,您的问题并不清楚您想做什么 - 我想到了两种解决方案:

Alt 1. 删除错误输入后再次询问。这可能适合此应用程序,因为它是交互式的,但对于从文件读取其输入的自动化程序来说,这是一个糟糕的主意。

if(!(cin >> num))
{
     cout << "That deoesn't seem to be a number..." << endl;
     cin.clear();
     cin.ignore(10000, '\n');
}

Alt 2. 退出并显示错误消息。当典型的输入是数据文件时,这显然是正确的。

 if(!(cin >> num))
 {
      cout << "That deoesn't seem to be a number..." << endl;
      exit(1); 
 }

您还应该在此代码中添加代码来处理文件结尾 - 对于应该可以接受的文件输入 [除非文件具有标记结尾的特定数据]。对于交互式输入(用户直接向程序输入),文件末尾可能会或可能不会被视为错误 - 实际上取决于接下来会发生什么。

在您的程序中,标准输入流需要一个整数。当你给它一个字符时,cin 不能把它放在整数变量中,即它失败(设置了错误标志)并将输入的字符留在缓冲区中(用于下一个 cin 分配)。 cin 反复将字符视为输入并不断失败,整数变量被赋值为 0.

为了防止您可以将程序修改为

int num;
    do{
        cout << "PLEASE enter the num: ";
        while(!(cin>>num)){
        cin.clear();
        cin.ignore(INT_MAX,'\n');
        cout<<"Invalid. Enter a number";
    }
        if (num % 2 == 0)
            cout << "Number should be odd!" << endl;
        else
            break;
    }
while(true);

包括 limits.h 以使用 INT_MAX 或者您可以使用较大的值,例如 10000。

cin.clear 清除错误标志并使其准备好接受输入。 cin.ignore(INT_MAX,'\n') 忽略所有内容(最多 INT_MAX 个字符)直到下一个新行。这确保了如果用户输入长行而不是数字,程序将正常工作。

我找到了解决问题的方法,我将输入类型更改为 string 并创建了一个函数:

int isNum(string input)
{
    int digit, value = 0;
    for (int i = 0; i < input.length(); i++)
    {
        digit = input[i] - '0';
        if (digit >= 0 && digit <= 9)
            value = value * 10 + digit;
        else
        {
            value = 0;
            break;
        }
    }
    return value;
}

如果所有字符都在 0 到 9 之间,它将 return 作为 int 输入,否则它将 return 0; 给我,所以我使用 return ed int 作为我的 num.