java中nextLine無法讀入字符串的問題

一直習慣了使用next()方法讀取字符串,今天遇到需要每次讀取一行數據的需求,於是便想到了使用nextLine()方法。但使用的時候發現問題出現了,使用nextLine讀取的字符串爲空。一起通過下面這個例子來看下。

輸入描述 

 第一行輸入一個整數N,表示字符串的數量。接下來的N行每行輸入一個字符串。如

3
abc
def
hij

 

輸出描述

每讀到一個字符串將其打印輸出 

是不是覺得很簡單?那我們來實現以下 

package leetcode.stack;

import java.util.Scanner;

/**
 * @基本功能:
 * @program:summary
 * @author:peicc
 * @create:2019-10-07 11:11:22
 **/
public class TestNextLine {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();//讀取整數N
        for (int i = 0; i <N ; i++) {
            String str=sc.nextLine();//每次讀取一行字符串
            System.out.println(str);
        }
    }
}

貌似跟想象中的有點不一樣!!!第一個字符串的內容應該爲abc,可輸出的卻爲空。第二個字符串本應該爲def,結果卻輸出了abc。第三個字符串本應該爲hij,結果是def。而hij直接沒輸出就結束了。 這是怎麼回事?我們仔細觀察就會發現,雖然輸出結果跟預期不一樣,但有一點還是沒問題的,那就是最終還是輸出了三個字符串,只不過每個字符串的內容跟我們想的不一樣。但規律也很好發現,就是一個字符串爲空,接下來的字符串都是正常輸出的前一個字符串。那麼我們就會問了,爲什麼第一個字符串爲空?這就需要從nextInt()方法與nextLine()方法 的區別去分析了。

next()與nextLine()的區別 

  • next()方法在讀取內容時,會過濾掉有效字符前面的無效字符,對輸入有效字符之前遇到的空格鍵、Tab鍵或Enter鍵等結束符,next()方法會自動將其過濾掉;只有在讀取到有效字符之後,next()方法纔將其後的空格鍵、Tab鍵或Enter鍵等視爲結束符;所以next()方法不能得到帶空格的字符串。
  • nextLine()方法字面上有掃描一整行的意思,它的結束符只能是Enter鍵,即nextLine()方法返回的是Enter鍵之前沒有被讀取的所有字符,它是可以得到帶空格的字符串的。
  • next()方法在掃描到空白符的時候會將前面的數據讀取走,但會丟下空白符“\r”在緩衝區中
  • nextLine()方法在掃描的時候會將掃描到的空白符一同清理掉

瞭解了上述區別後,我們就很好理解上面程序的運行結果了。首先通過nextInt()方法讀取字符串的行數,但此時讀取了N之後,N之後的換行符還在緩衝區中,此時當我們在for循環中第一次調用nextLine()方法時,讀取的是N之後的換行符以及換行符之前沒被讀取的值,也就是空。故第一個字符串的內容爲空。緊接着,第二次調用nextLine()方法時,讀取的便是abc及其之後的換行符,第三次調用nextLine()方法時,讀取的是def及其之後的換行符。循環了三次,結束循環,因此最後的hij便沒有讀取得機會。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章