0

そのため、私が取り組んでいるこのプログラムは、間違ったユーザー入力を希望どおりに処理していません。ユーザーは、後で HotelRoom オブジェクト コンストラクターで使用するために、3 桁の数字のみを入力できる必要があります。残念ながら、私のインストラクターは、クラスでの文字列オブジェクトの使用を許可していません (そうでなければ、問題はないと思います)。また、コンストラクターに roomNumBuffer を渡して const char ポインターを作成しています。現在、iostream、iomanip、string.h、および limits プリプロセッサ ディレクティブを使用しています。この問題は、roomNumBuffer に多すぎる文字を入力しようとした後に発生します。次のスクリーンショットは、何が起こるかを示しています。 ここに画像の説明を入力

この問題に関連するコードは次のとおりです。

cout << endl << "Please enter the 3-digit room number: ";
do {        //loop to check user input
    badInput = false;
    cin.width(4);
    cin >> roomNumBuffer;
    for(int x = 0; x < 3; x++) {
        if(!isdigit(roomNumBuffer[x])) {        //check all chars entered are digits
            badInput = true;
        }
    }
    if(badInput) {
        cout << endl << "You did not enter a valid room number. Please try again: ";
    }
    cin.get();      //Trying to dum- any extra chars the user might enter
} while(badInput);

for(;;) {   //Infinite loop broken when correct input obtained
    cin.get();      //Same as above
    cout << "Please enter the room capacity: ";
    if(cin >> roomCap) {
        break;
    } else {
        cout << "Please enter a valid integer" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}
for(;;) {   //Infinite loop broken when correct input obtained
    cout << "Please enter the nightly room rate: ";
    if(cin >> roomRt) {
        break;
    } else {
        cout << "Please enter a valid rate" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

どんなアイデアでも大歓迎です。前もって感謝します。

4

2 に答える 2

2

整数を読み取り、それが目的の範囲内にあるかどうかをテストします。

int n;

if (!(std::cin >> n && n >= 100 && n < 1000))
{
    /* input error! */
}
于 2012-11-20T23:25:10.133 に答える
0

Kerrek SB は問題に対処する方法を提供していますが、アプローチの何が問題なのかを説明するために、整数配列を正常に読み取ることができました。ストリームは良好な状態でしたが、スペースに到達しませんでした。つまり、あなたのアプローチを使用するには、最後の数字に続く文字、つまりストリーム内の次の文字が何らかの空白であることもテストする必要があります。

if (std::isspace(std::cin.peek())) {
     // deal with funny input
}

ただし、最初の値のエラー回復は正しくないようです。ignore()おそらく、行末まですべての文字を表示したいでしょう。

于 2012-11-20T23:37:11.890 に答える