2015-08-29 50 views
1

我正在閱讀一本關於java書的入門書,並且在本節中涉及while while循環。這裏是代碼:丟棄輸入緩衝區中的字符?

public class GuessingGameV4 { 

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

     char ch, ignore, answer; 

     answer = 'K'; 

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

      ch = (char) System.in.read(); 

      do { 
       ignore = (char) System.in.read(); 
      } while (ignore != '\n'); 

      if (ch == answer) System.out.println("Right!!! "); 
      else { 
       System.out.print("Sorry you are "); 
       if (ch < answer) System.out.print("too low.\n"); 
       else System.out.print("too high.\n"); 

       System.out.println("Try again\n"); 
      } 
     } while (answer != ch); 
    } 
} 

內部do while循環涉及忽略是放棄輸入緩衝區中的字符的代碼的一部分。

我只是想更多地說明它實際上做了什麼,因爲書籍的解釋並不適合我。

回答

2

我想這是傳給你麻煩的部分:

System.out.println("I am thinking of a letter between A and Z"); 
System.out.println("Can you guess it?"); 

ch = (char) System.in.read(); 

do { 
    ignore = (char) System.in.read(); 
} while (ignore != '\n'); 

該計劃要求用戶輸入一個字母。 但System.in被緩衝。 用戶實際上可以輸入多個字符。 即使是一個長長的句子。 直到最後他按下回車,這是字符'\n'

程序讀取一個字符ch

ch = (char) System.in.read(); 

然後,它更進一步,並保持閱讀,直到它找到一個'\n'字符:

do { 
    ignore = (char) System.in.read(); 
} while (ignore != '\n'); 

如果你不這樣做, ,那麼用戶輸入的任何額外輸入將繼續用於外循環的下一次迭代。 你不希望任何結轉, 你只想輸入的第一個字符, 丟棄其餘的, ,以便在下一次迭代中,你開始一個乾淨的緩衝區。

試用ignore註釋掉的循環代碼。 如果輸入單個字母 ,則外部循環將運行兩次,輸入的字母爲 ,輸入的字符結尾爲'\n'。 如果輸入多個字母, 假設爲「hello」, 循環將運行6次, 用於字母h-e-l-l-o 5次,而'\n'字符用於結束輸入。

- >與ignore的循環是清除輸入緩衝區所必需的。

0

這是一個奇怪的例子。

它會說「正確!!!」答案:

Its definitely not K\n 

因爲它會忽略所有,但最後一個字符在你輸入線和最後一個字符比較在answer變量的字符。

更新:實際上,它忽略了除第一個字符以外的所有字符。抱歉。所以它應該是

K is definitely not the answer\n 

我想它的處理\ r \ n在行結束時像在Windows下的情況。 (回車)