scanner.nextInt()等next()和scanner.nextIine()連用注意事項

scanner.nextInt()等next()和scanner.nextIine()連用注意事項

背景:需求是輸入二維矩陣行列數和矩陣的內容。我想要的效果是這樣的,用兩個int記錄第一行輸入行列數,剩下用string記錄用戶輸入的二維矩陣內容。

實操出現問題:

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	while(scanner.hasNext()) {
		int x = scanner.nextInt();
		int y = scanner.nextInt();
		if (x==0&&y==0) {
			scanner.close();
			break;
		}
		//scanner.nextLine();
		String a = "";
		for (int i = 0; i < x; i++) {
			a +=scanner.nextLine();
		}
		for (int i = 0; i < a.length(); i++) {
			if (i%y == 0) {
				System.out.println();
			}
			System.out.print(a.charAt(i));
			
		}
		
		}
}

輸入卻出現了問題,本想輸入4行4列,卻只接收了3行數據,就開始打印了,如圖:

在這裏插入圖片描述

原因:

這就涉及到next()與nextline()方法區別的。
nextInt()的API寫到 “將輸入信息的下一個標記掃描爲一個 int”;
nextline()是“此掃描器執行當前行,並返回跳過的輸入信息。 此方法返回當前行的其餘部分,不包括結尾處的行分隔符。當前位置移至下一行的行首。 因爲此方法會繼續在輸入信息中查找行分隔符,所以如果沒有行分隔符,它可能會緩衝所有輸入信息,並查找要跳過的行。”


(假設還是以上輸入)所以上面的代碼分析是這樣的:

/*用戶輸入:
 
  4空格4\n  	//遇到空格結束 x=4, 第二nextInt()遇到換行了結束它的掃描 y=4;
  			但是此行還沒有結束,nextLine會繼續掃描剩餘部分直到換行,光標纔會進入下一行
  			只不過剩餘的是空字符串,記第一次nextLine()爲a1,a1=""
  ****\n  	//a2 = "****",a2記第二次nextLine()
  ....\n  	//a3= "...."
  ....\n	//a4= "...."	
  ****\n	//此刻此行沒有對應的nextline(),也就無法輸入了,接下就執行打印輸出了。
  
  */

解決:

在nextInt()與想接收數據nextline()之間再添加一行scanner.nextLine();用於緩衝換行符,換入新的一行。

int x = scanner.nextInt();
		int y = scanner.nextInt();
		if (x==0&&y==0) {
			scanner.close();
			break;
		}
		scanner.nextLine();//用於緩衝換行符,換入新的一行。
		String a = "";
		for (int i = 0; i < x; i++) {
			a +=scanner.nextLine();
		}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章