1

重複の可能性:
数値入力 C++ を検証する方法

次のことをどのように行いますか。

while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
    cout << "Enter number of players (1-4): ";
    cin >> iNumberOfPlayers;
    cin.clear();
    std::string s;
    cin >> s;
}

私がスローされたループを見た後、cinリセットされていないように見えます (x を入れた場合)ループ内cinにいる限り、X を再度読み取りwhileます。これはバッファの問題だと思いますが、クリアする方法はありますか?

次に試しました:

while (iNumberOfPlayers <2 || iNumberOfPlayers >5)
{
    cout << "Enter number of players (1-4): ";
    cin >> iNumberOfPlayers;
    cin.clear();
    cin.ignore();
}

一度にすべてを1つずつ読み取ることを除いて、これは機能します。「xyz」を入力すると、ループが 3 回実行されてから、再度質問するために停止します。

4

2 に答える 2

7

入力が有効でない場合、フェイル ビットがストリームに設定されます。ストリームで使用される演算子は、失敗ビットを読み取ります (または!も使用できます)。(cin >> a).fail()(cin >> a), cin.fail()

次に、再試行する前に、失敗ビットをクリアする必要があります。

while (!(cin >> a)) {
    // if (cin.eof()) exit(EXIT_FAILURE);
    cin.clear();
    std::string dummy;
    cin >> dummy; // throw away garbage.
    cout << "entered value is not a number";
}

非インタラクティブな入力から読み取る場合、これは無限ループになることに注意してください。そのため、コメント付きのエラー検出コードにいくつかのバリエーションを使用してください。

于 2012-07-14T14:54:44.017 に答える
3

注意が必要なのは、読み取りに失敗しても入力が消費されないため、無効な入力を消費する必要があることです。これに対する最も簡単な解決策は、 への呼び出しをoperator >>ループ状態に移動し、 を読み取る\nことができなかった場合は まで読み取ることintです。

#include <iostream>
#include <limits>

int main() {
  int a;
  while (!(std::cin >> a) || (a < 2 || a > 5)) {
    std::cout << "Not an int, or wrong size, try again" << std::endl;
    std::cin.clear(); // Reset error and retry
    // Eat leftovers:
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  }
}
于 2012-07-14T15:01:17.050 に答える