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();
}