0

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

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

#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;
}
4

2 回答 2

1

您正在阅读的数字是数字,而不是isdigit函数所期望的字符。如果您使用的是符合 C++11 标准的标准库,如果输入不是有效的整数,则a和的值实际上将为零,这意味着例如将是. 如果您使用的是非 C++11 库,那么 和 的值将是随机的,并且很可能导致为真,并且在完整的 32 位整数范围内有效数字 ASCII 值的数量相当小的。b!isdigit(a)trueab!isdigit(a)


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

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

或者可以使用流fail功能对其进行测试。

于 2013-02-15T06:23:10.243 回答
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));在程序开始时调用一次。

于 2013-02-15T06:35:39.717 回答