使用if c ++进行无限循环

时间:2015-12-22 07:52:16

标签: c++ if-statement break do-while cin

在这个循环中,用户应该输入一个int并且程序检查它是否奇怪它会转到下一个部分,但是我不明白为什么如果用户输入的字符不是int ,程序正处于无限循环中!

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),但它对我没有帮助。 请告诉我如何解决这个问题,以及为什么会这样。

3 个答案:

答案 0 :(得分:4)

因此,您的计划不会检查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); 
 }

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

答案 1 :(得分:0)

在您的程序中,标准输入流需要一个整数。当你给它一个字符时,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);

包括使用INT_MAX的limits.h,或者你可以使用像10000这样的大值。

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

答案 2 :(得分:0)

我找到了解决问题的方法,我将输入类型更改为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之间,它会将输入返回int,否则它会return 0;给我,所以我使用返回的int作为{{1} }}