0

関数 require() のループは、a > b または "a" または "b" が数字ではないという 3 つの条件を取ります。条件を満たさずに整数を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これは特定の文字が指であることに関連しているため、使用しないでください。代わりに、ループは次のようになります。

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 に答える
1

isdigit関数が期待する文字としてではなく、数字として数字を読んでいます。C++11 準拠の標準ライブラリを使用している場合、入力が有効な整数でない場合、aとの値は実際にはゼロになります。つまり、は になります。C++11 以外のライブラリを使用している場合、 と の値はランダムになり、32 ビット整数の範囲内の有効な数字 ASCII 値の量が非常に多くなるだけでなく、ほとんどの場合 true になります。小さな。b!isdigit(a)trueab!isdigit(a)


このような入力演算子に関するリファレンスを読むと、抽出が失敗した場合にストリームfailbitが設定されることがわかります。これは、次のように「インライン」でテストできます。

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

failまたは、ストリーム関数を使用してテストできます。

于 2013-02-15T06:23:10.243 に答える