簡體   English   中英

清除掃描儀緩沖區 Java

[英]Clearing Scanner Buffer Java

在 java 中使用 nextInt() 和 nextLine() 時,是否需要在使用一系列 nextInt() 后清除輸入緩沖區?

Scanner input = new Scanner(System.in);
int age = input.nextInt();
int height = input.nextInt();
int weight = input.nextInt();

在上面的代碼中,我是否需要在每個 input.nextInt( input.nextLine() input.nextInt()來讀取行尾字符。 或者僅當我嘗試在 int 之后讀取字符串時才適用清除行尾字符,例如:

Scanner input = new Scanner(System.in);
int age = input.nextInt();
String name = input.nextLine();

在這種情況下,我必須在閱讀年齡后使用input.nextLine( )。 我在讀取整數后嘗試使用input.nextLine() ,但我沒有看到結果有任何差異。 那么最佳實踐是什么?

100 個教程和答案中有 99 個說“是”,包括 StackOverflow 上的答案。 但他們是不正確的。 不,你沒有。

但重要的是要確保您的掃描儀實際上在做您認為應該做的事情,這就是問題所在:開箱即用,掃描儀的配置方式出乎大多數人的意料。 只需正確配置它,一切都很好。

具體來說,當您要求鍵盤輸入並使用掃描儀獲取它時,與我交談的大多數人似乎都認為輸入鍵是分隔輸入的。 但這不是掃描儀默認的工作方式 默認情況下,任何數量的空格都會分隔輸入。 如果您不想以這種方式拆分輸入,這會導致問題。

解決方法是告訴掃描儀單個換行符是分隔符,而不是“任何數量的空格”(當您按下回車鍵時發生的事情是換行符,與您點擊 ' 時發生的事情相同c' 鍵是一個 'c' 字符)。

你這樣做:

scanner.useDelimiter("\\R");

那是因為\\R是“換行符”的正則表達式,並且掃描儀通過使用正則表達式引擎查找分隔符來工作。 這會處理各種平台上“換行符”的不穩定定義(取決於大量因素,它是 \n 或 \r\n, \\R會處理所有這些)。

然后,確保您正確理解掃描儀。 本質上,這意味着:永遠不要調用nextLine() ,它不會做你認為它做的事情。 您說分隔符是換行符,因此,輸入標記是整行,因此.next()為您提供整行。

換句話說:

  1. 創建后立即調用scanner.useDelimiter("\\R")
  2. String name = input.next(); . nextLine 沒有目的,只是破壞事物,不要調用它。
  3. 不做這些事情確實使它看起來像交錯nextLine()nextInt()需要“清除緩沖區”等等。 如果用戶決定使用鍵盤上最大的鍵:空間,任何解決此問題的嘗試都會失敗。 因此,不要試圖“修復緩沖區”。 盡管許多教程確實錯誤地建議您可以通過這種方式解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM