首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Scanner 讀取字符串數組跳過首行問題解析

     編輯:程式設計綜合問答

使用 `Scanner.nextInt()` 後緊接 `nextLine()` 讀取字符串時,首行會被跳過。這是因為 `nextInt()` 不消耗換行符,導致 `nextLine()` 讀到空行。本文解析原因並給出三種解決方案。

問題代碼

Scanner input = new Scanner(System.in);
int number = input.nextInt();        // 輸入 2 並按回車
String[] name = new String[number];
for (int i = 0; i < number; i++) {
    name[i] = input.nextLine();      // 第一次循環讀到空字符串!
}

根本原因

  • 輸入緩沖區內容:"2\n"
  • `nextInt()` 讀取 2,停留在 `\n` 前
  • `nextLine()` 讀取「當前位置到換行符」→ 空字符串,消耗掉 `\n`
  • 第二次 `nextLine()` 才真正等待用戶輸入姓名

解決方案一:額外調用一次 nextLine() 消耗換行符

int number = input.nextInt();
input.nextLine();  // 關鍵:消耗殘留的換行符
for (int i = 0; i < number; i++) {
    name[i] = input.nextLine();  // 正常讀取
}

解決方案二:統一用 nextLine() + 解析

int number = Integer.parseInt(input.nextLine().trim());
for (int i = 0; i < number; i++) {
    name[i] = input.nextLine();
}

解決方案三:用 next() 讀取無空格姓名

for (int i = 0; i < number; i++) {
    name[i] = input.next();  // 按空白分隔,自動跳過換行符
}

缺點:姓名含空格 (如 "Mary Ann") 會被截斷。

最佳實踐建議

  1. **統一行讀取**:所有輸入用 `nextLine()`,數值類型用 `Integer.parseInt()`/`Double.parseDouble()` 轉換
  2. **封裝工具類**:
public class InputUtil {
    private static Scanner sc = new Scanner(System.in);
    public static int readInt() {
        return Integer.parseInt(sc.nextLine().trim());
    }
    public static String readLine() {
        return sc.nextLine();
    }
}

擴展:Scanner 定界符機制

  • `next()` / `nextInt()` 默認定界符:\\s+ (空白字符:空格、制表符、換行符)
  • `nextLine()` 定界符:\n (僅換行符)
  • 可自定義:`sc.useDelimiter(",")` 解析 CSV

總結

`nextInt()` 後殘留換行符是 Java Scanner 經典坑。**牢記:混用 `nextXxx()` 和 `nextLine()` 時,必須額外 `nextLine()` 清理緩沖區**,或全程統一用 `nextLine()` + 手動解析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved