1

私は switch ステートメントを作成し、ユーザーが間違ったオプションを選択して入力を繰り返すだけのデフォルトを作成しました。問題が発生した場合に最初にバッファをクリアすることを確認したかったので、cin.sync() を使用しましたが、入力に「a」を入力すると、依然として無限ループが発生しました。私は cin.clear() を追加してフラグをクリアし、コードを動作させました...しかし、私の混乱はそれが機能した理由です。失敗フラグがある場合、cin.sync() は機能しませんか?

ステートメントは次のとおりです。簡潔にするために切り捨てられています。

while(exitAllow == false)
{
    cout<<"Your options are:\n";
    cout<<"1: Display Inventory\n";
    /*truncated*/
    cout<<"5: Exit\n";
    cout<<"What would you like to do? ";

    cin.clear();   //HERE IS MY CONFUSION//
    cin.sync();
    cin>>action;
    switch(action)
    {
        case 1:
                    /*truncated*/
        case 5:
            exitAllow = true;
            break;
        default:
            cout<<"\ninvalid entry!\n";
            break;
    }
}
4

1 に答える 1

2

読み取りを試みて失敗すると、ストリームは失敗状態にあるとマークされ、関数で行われる失敗フラグをクリアするまで、後続のすべての読み取り試行は自動的に失敗しclear()ます。

読み取りごとストリームのステータスを確認する必要があります。

if (cin >> var) {
   // do something sensible
} else {
   cin.clear();
}

そうしないと、最後に成功した読み取りの後に格納された値varが、アルゴリズムの現在の入力と見なされます。

于 2012-12-05T02:02:38.867 に答える