0

以下のコードは、すべての入力を 1 回チェックし、入力が数値でない場合は常に「数値ではありません」と表示する必要があります。

int input;
while (1 == 1){
    cout << "Enter a number: ";
    try{
        cin.exceptions(istream::failbit);
        cin >> input;
    }catch(ios::failure){
        cout << "Not a number\n";
        input = 0;
    }
}

問題は、catch が呼び出されると (数値ではない場合)、while() ループが数回実行された場合のように「無効な数値」が際限なく表示されますが、新しい入力は求められないことです。

4

3 に答える 3

3

while(true)またはwhile(1)[またはfor(;;)] は、「永久ループ」を作成する慣習的な方法です。

cinストリーム内で受け入れられない入力を「クリーンアップ」する必要があります。典型的なアプローチは、次の改行まですべての入力を無視する呼び出しですcin.ignore(1000, '\n');[最大 1000 文字 - より大きな数を選択できますが、通常は 1000 で「改行に到達するのに十分です]。

ほぼ確実に (Potatoswatter に感謝します)cin.clear();入力を呼び出して状態を削除し、failed次の入力が成功するようにする必要があります。[cin.ignore()さらに入力するので、その前に行く必要があります - 明確にするために]。

于 2013-08-02T23:11:44.420 に答える
1

ストリームから文字を に抽出できませんでしたがint、それらの文字はストリームに残っているため、代わりに別のものとして抽出を試みることができます。

それらを完全にスキップするには、ブロックstd::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');内で実行します。catch

次に、ユーザーが次に入力するものはすべてストリームの最初のものになります。そしておそらくそれは数字になるので、次の への抽出の試みはint成功します。

于 2013-08-02T23:16:37.487 に答える