Java入力バッファとやる-whileループの振る舞い(なぜそれが最初の文字を3回チェックしていますか?)

ジム・アンダーソン:

私は、Oracleの「JavaのA初心者のためのガイド」でのJavaの学習されており、トラブルループ行う-ながら、入力バッファについての本からのプログラム例を理解することを有しました。

この例では、プログラムを推測数についてです。あなたが入力した可能性のあるすべての余分な文字を無視するように設計されています。あなたはABCを入力するのであれば、それが唯一のA.をチェックします入力してプッシュします

私はとの取引は、その後無視するプログラムを実行することを第二DO-whileループをコメントアウトした場合私の質問は、それをチェックし、その単一文字3回、複数の入力バッファについてです。私はシングル「A」を入力したのであれば、それを入力して押して3回をチェックして、私は出力宣伝文句「...申し訳ありませんが、あなたが低すぎるよ」3回を取得するために表示されます。

私は「AZ」を入力した場合、4回をチェックしているようだ入力押し、次にA 2回以上、その後Zをチェックします。


質問:

  1. なぜ常に最初の文字を3回チェックしているように見えるのでしょうか?
  2. キーアサインを入力してください\ nに変数を無視していますか?
    第2回は行う-ながら、ときにループがコメントアウトされていない、これはあなたがABCと入力した場合、次に入力押し、正しい順序で?
    - CHに割り当てられた
    割り当てられたB-は無視する
    C-を無視するために割り当てられた
    キー(\ n)を入力します-割り当てられているので、無視、無視するように割り当てをループ終了を\ nは

キー実際に割り当てを入力してください\ nは無視するならば、私はビットが混乱していますか?それとも、ただもう文字がなくなるまで無視するように割り当てることを待っていますか?この本は、押しが原因改行を入力してくださいと言います。そう-ながら、そのループが終了したとき:(無視=「\ n」の!)。

任意の助けてくれてありがとう!

class Guess4{
    public static void main (String args[])
        throws java.io.IOException {

            char ch, ignore, answer = 'K';

            do {
                System.out.println("I'm thinking of a letter between A and Z.");
                System.out.println("Can you guess it: ");

                //read a character
                ch = (char) System.in.read();

                /* discard any other characters in the input buffer
                do {
                    ignore = (char) System.in.read();
                } while(ignore != '\n');
                */

                if(ch == answer) System.out.println("**Right**");
                else {
                    System.out.print("...Sorry, you're ");
                    if(ch < answer) System.out.println("too low");
                    else System.out.println("too high");
                    System.out.println("Try again!\n");
                }
            } while(answer != ch);
        }
}
ドウ・ジョンソン:

質問1:

(私はすでに私のコメントで書いたように、私はちょうど1つの文字を入力した場合、私は正しい動作である、私は2を持って、3行を取得していません)

最初の文字が複数回チェックされていることをあなたの仮定が間違っています。簡単なデバッグのために、テストされる文字を印刷します:

// ...
System.out.println("Now checking: '" + ch + "''");
if(ch == answer) System.out.println("**Right**");
// ...

さて、あなたが入力したときabc[enter]、あなたは各文字が個別に処理され、それらのそれぞれが同じメッセージを引き起こしていることがわかります。また、改行がテストされます。

質問2:

あなたは絶対的に正しいです。

一つの重要な事がありますけれども:第二の全体のポイントは何-ながら構築物はあなたの次の推測のための入力ストリームをクリアすることです!それは、少なくともしようと上記のコメントが指摘するものです:discard any other characters in the input buffer改行をチェックすることは、1つの推測が1行に制限されているので、あなたがループを終了することができます知っているだけのようです!実はあなたも、すべての変数を無視している必要はありません。文字は、それを読むことによって流から除去されます。それが呼び出すことによって、読書自体についてですので、System.in.read()-あなたは何に結果を割り当てる必要はありません。

あなただけで二DO-whileループを置き換えることができますdo {} while(System.in.read() != '\n');

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=231225&siteId=1