布尔条件在do-while循环中无法正常工作

时间:2013-02-15 06:19:43

标签: c++ boolean do-while

函数require()中的循环需要3个条件,a> b或“a”或“b”不是数字。即使我不满足条件并将2个整数放入其中,它也会再次循环。

当我输入一个字符时,它只是无休止地循环“输入最小数字输入最大数字”忽略了这些字符。谁知道为什么?我是初学者,所以这可能很明显

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

int random(int minN, int maxN)   //generates random number within specified range
{
    srand (time(NULL));
    int x = (maxN - minN);
    int y = minN + (rand() % (x+1));
    return y;
}

int require()        //makes sure a < b and both are digits
{
    int a,b;
    do {
    cout << "Enter minimum number" << endl;
    cin >> a;
    cout << "Enter maximum number. Note: Has to be greater or equal to minimum." << endl;
    cin >> b;
    } while (a > b || !isdigit(a) || !isdigit(b));

    return random(a,b);
}

int main()
{
    cout << require() << endl;
}

2 个答案:

答案 0 :(得分:1)

您正在读取数字,因为数字不是isdigit函数所期望的字符数。如果您使用符合C ++ 11的标准库,如果输入不是有效的整数,则ab的值实际上将为零,这意味着,例如!isdigit(a)将为true。如果您使用的是非C ++ 11库,那么ab的值将是随机的,并且很可能会导致!isdigit(a)为真,以及金额完整32位整数范围内的有效数字ASCII值非常小。


如果您阅读有关输入运算符的引用,例如this one,您将看到如果提取失败,则将设置流failbit。这可以像这样“内联”测试:

if (!(std::cin >> a))
{
    std::cout << "Not a valid number, try again: ";
    continue;
}

或者可以使用流fail函数进行测试。

答案 1 :(得分:1)

您不应该使用isdigit,因为这与特定字符相关。相反,循环应如下所示:

int require()        //makes sure a < b and both are digits
{
    validNumbers = true;
    do
    {
       cout << "Enter minimum number" << endl;
       cin.clear();
       cin >> a;
    } while (cin.fail());

    do
    {
       cout << "Enter maximum number. Note: Has to be greater or equal to minimum."
            << endl;
       cin.clear();
       cin >> b;
    } while (cin.fail() || a > b);

    return random(a,b);
}

PS:您只需在程序开始时拨打srand (time(NULL));一次。