2

このプログラムは、指定された範囲内の指定された量の数値を出力します。ただし、文字を入力すると、どちらのループでも無限にループします。たとえば、「最大数を入力」cinに文字を入力すると、「最大数を入力」を無限にスパムし、スキップします。 cinとcoutをループします(他の2つのdo-whileについても同じです。誰かが理由を知っていますか?

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

using namespace std;

int roll(int mini, int maxi)
{
        int v = maxi - mini;
        int x  = mini + (rand() % (v+1));
        return x;

}
void caller()
{
    int a;
    int b;
    int c;

    do {
    cout << "Enter minimum number" << endl;
    cin.clear();
    cin >> a;
    } while (cin.fail());

    do {
    cout << "Enter maximum number" << endl;
    cin.clear();
    cin >> b;
    } while (cin.fail() || a > b);

    do {
    cout << "How many rolls?" << endl;
    cin.clear();
    cin >> c;
    } while (cin.fail());

    for (int i = 0; i < c; i++)
    cout << roll(a, b) << endl;
}

int main()
{
    srand (time(NULL));
    caller();
    return 0;
}
4

2 に答える 2

2

istream::fail()はループ制御には使用したくない。ループ条件内のiostream::eofが間違っていると見なされるのはなぜですか?を参照してください。同様の問題について。

代わりに、の戻り値に依存しますistream::operator >>

また、次の関数を使用してフラグをリセットし、入力ストリームの入力をクリアします。

void flush_stream(std::istream& stream)
{
    stream.clear();
    stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

cinバッファーをフラッシュするにはどうすればよいですか?を参照してください。詳細については。

したがって、入力チェックを次のようにコーディングします。

int get_valid_number(const std::string& prompt)
{
    int number = 0;

    bool valid = false;
    while (!valid)
    {
        std::cout << prompt << std::endl;
        if (std::cin >> number)
        {
            valid = true;
        }
        flush_stream(std::cin);
    }

    return number;
}

うまくいけば、これを関数に抽出することの利点は明らかです。それが実行されるのを見てください

于 2013-02-16T07:48:59.087 に答える
2

あなたは次のようなことをやってみることができます

int a;
string trash;

do {
  cout << "Enter minimum number" << endl;
  cin >> a;

  if(cin.fail()){
    cin.clear();
    cin >> trash;
  }

} while (cin.fail());

これにより、cinストリームから不正な入力を文字列にスローすることにより、削除しtrashます。

cinこのリンクは、これらの機能を少しよく理解するのに役立つ場合があります。

http://web.eecs.utk.edu/~cs102/lectures/cinLecture.html

于 2013-02-16T08:35:27.563 に答える