1
bool showMenu(romanType roman){
    cout << endl;
    cout << "Just enter a number to choose an option" << endl;
    cout << "1: Print the Roman Numeral" << endl;
    cout << "2: Print the decimal value" << endl;
    cout << "3: Enter a new Roman Numeral" << endl;
    cout << "4: Quit the program" << endl;
    cout << endl;
    while (true) {

        cout << "Your choice:" << endl;
        int input;
        cin >> input;
        if (input == 1) {
            cout << roman.getRomanString() << endl;
        } else if(input ==2) {
            cout << roman.getDecimalValue() << endl;
        } else if(input == 3) {
            return true;
        } else if(input == 4) {
            return false;
        } else {
            cout << "Invalid selection, please make a valid selection." << endl;
        }
    }
}

降りて、概してこれはうまく機能します、私は私の最後のelseステートメントで1つの小さな問題を抱えています。ユーザーがintのタイプを入力している限り、ループは想定どおりに動作しますが、任意の種類の文字列(45r、rts、3e5など)が入力されると、ループはユーザー入力の取得を停止し、無限にスパイラルします。 ing)無効な選択...そしてあなたの選択...何度も何度も。文字列の場合は\nを削除するために.ignore()を使用する必要があると思いますが、その方法がわかりません。私は正しい方向に進んでいますか?

4

1 に答える 1

4

はい、あなたは正しい軌道に乗っています。

cin >> input整数を抽出しようとします。これが失敗した場合、シンボルは抽出されcinず、failbit が設定されます。この場合、抽出は機能しなくなります。ignore残りのユーザー入力とclearエラー ビットが必要です。

} else {
    cout << "Invalid selection, please make a valid selection." << endl;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(),'\n');

// numeric_limits<streamsize>::max() returns the maximum size a stream can have,
// see also http://www.cplusplus.com/reference/std/limits/numeric_limits/
}

この cin の読みが詰まっているのはなぜですか?も参照してください。.

于 2012-06-07T19:15:46.603 に答える