2
while (!correct)
    {   

        cout << "Please enter an angle value => ";
        cin >> value; //request user to input a value

        if(cin.fail()) // LINE 7
        {
            cin.clear(); // LINE 9
            while(cin.get() != '\n'); // LINE 10
            textcolor(WHITE);
            cout << "Please enter a valid value. "<< endl;
            correct = false;

        }
        else
        {
            cin.ignore(); // LINE 18
            correct =true;
        }
    }

こんにちは、これは私が書いたコードの一部です。このコードの目的は、ユーザーが 10、10.00 などの数字を入力するように制限することです。(abc、!$@、など...) のような値を入力すると、コードはユーザーに値の再入力を要求します。

この機能 (ユーザーが有効な値を入力するように制限する) を実行するために、フォーラムを通じていくつかのヒントとガイドを入手します。

これらのコードが何をするのかを学び、理解することは私の責任だと思います...このコードを使用するのはこれが初めてなので。7行目、9行目、10行目、18行目のコードが何をするのか簡単に説明してもらえますか? 特に10行目。10行目だけの他の行で簡単なアイデアを得ました。それが何をしたのかわかりません。

あなたのガイドをありがとう、私はそれを感謝します!

4

7 に答える 7

2

cin.fail()前の入力操作で「何かが失敗した」かどうかを示します。入力ストリームbadには 、goodeofおよびfail(ただしfailbadたとえば と を同時に設定できます) の 4 つの状態が認識されると思います。

cin.clear()状態を にリセットしますgood

while(cin.get() != '\n') ;現在の入力行の終わりまで読み取ります。

cin.ignore();は次の改行までスキップするため、 と非常によく似ていwhile(cin.get() != '\n');ます。

コード全体もファイルの終わりをチェックする必要があります。そうしないと、正しい入力が与えられず、入力が「終了」した場合 (プラットフォームに応じて CTRL-Z または CTRL-D など) ハングします (失敗して永遠にループします)。

于 2013-07-28T10:01:31.053 に答える
1

// LINE 7:cin.fail() は、入力された値が変数で定義された値に適合するかどうかを検出します。

// LINE 18:cin はストリームに改行文字を残します。次の行に cin.ignore() を追加すると、ストリームから改行がクリア/無視されます。

于 2013-07-28T09:59:01.603 に答える
0

7 行目と 9 行目については、ドキュメントを参照してください。

while(cin.get() != '\n'); // LINE 10

では、行が空行かどうか、つまり新しい行だけを含むwhileかどうかをテストします。cin.get()

于 2013-07-28T09:57:21.080 に答える
0

7 行目: 入力されたデータが正しいかどうかをテストします ( として読み取ることができますdecltype(value))。ストリームで何らかのエラーが発生した場合cin.fail()は常にです。trueその後、

cin9 行目:状態を悪い状態から以前の正常な状態にクリアします。(エラー後に回復します)。悪い状態から回復するまで、データを読み取ることはできません。

10 行目: 行末まで読みました。基本的に、入力から1行スキップします

18 行目: この行は、入力されたデータが修正された場合にのみ実行されます。stdin から 1 行を読み取って破棄します。

于 2013-07-28T09:58:17.750 に答える
0

標準入力ストリーム ( cin) は、さまざまな理由で失敗する可能性があります。

たとえば、valueintで、ユーザーが のような大きな数値を入力した場合 124812471571258125cin >> value数値が大きすぎて に収まらないため失敗しintます。

しかし:

あなたが望むことを行うためのはるかに簡単な方法があります。ユーザーに有効な浮動小数点値 (10 や 10.00 など) のみを入力してもらいたいのですが、文字は入力しないでください。したがって、これを行うことができます:

double value;
cout << "Please enter an angle value: " << endl;
while (!(cin >> value)) { //Since value is a double, (cin >> value) will be true only if the user enters a valid value that can be put inside a double
  cout << "Please enter a valid value:" << endl;
}

これはコードと同じことを行いますが、はるかに単純です。

他に何が原因cinで失敗するのか興味がある場合は、こちらをご覧ください: http://www.cplusplus.com/forum/beginner/2957/

于 2013-07-28T09:58:31.333 に答える
0

while(cin.get() != '\n'): c のすべての文字列は null で終了します。これは、\n がすべての文字列オブジェクトの末尾であることを意味します。c に "this" という文字列があるとします。これは this\n で、各アルファベットは char 型に格納されています。http://www.functionx.com/cpp/Lesson16.htmに沿ってお読み ください。

cin.fail(): cin.fail() は、入力された値が変数で定義された値に適合するかどうかを検出します。

読む: http://www.cplusplus.com/forum/beginner/2957/

cin.ignore(): 入力シーケンスから文字を抽出し、それらを破棄し ます http://www.cplusplus.com/reference/istream/istream/ignore/

于 2013-07-28T10:00:37.710 に答える
0

スタック オーバーフローではリンクを一覧表示するだけではよくないことはわかっているので、もう少し詳しく説明しますが、この回答は実際には一連のリンクに要約されます。

7 行目については、cin.fail をググってください。 ここに良いリファレンスがあります。

ストリームに failbit または badbit エラー状態フラグのいずれか (または両方) が設定されている場合、true を返します。

これらのフラグの少なくとも 1 つが、入力操作中にファイルの終わりに到達する以外のエラーが発生したときに設定されます。

通常、エラーが操作自体の内部ロジックに関連している場合、failbit は操作によって設定されます。ストリームに対するさらなる操作が可能になる場合があります。通常、badbit は、エラーがストリームの整合性の喪失を伴う場合に設定されますが、ストリームで別の操作が試行された場合でも持続する可能性があります。badbit は、メンバー関数 bad: One line translationを呼び出すことで個別にチェックできます。入力ストリームの読み取り中に予期しないエラーが発生したかどうかがわかります。

cin.ignorecin.clear、およびcin.getについても同様のリファレンスを見つけることができます。簡単な要約:

cin.ignore - ストリームに存在する 1 文字を無視します。 cin.clear - ストリーム内のすべてのエラー フラグをクリアします 。 cin.get - 改行文字に到達するまで、一度に 1 文字ずつ取得します'\n'

于 2013-07-28T10:02:57.450 に答える