Java中如何用Scanner正确读取多词长字符串输入
Scanner读取带空格的多词输入的修正方案
问题根因
Scanner.next()的读取逻辑为:从当前位置开始,读到第一个空白字符(空格、换行、制表符等)就停止,仅返回前面的字符串内容。碰到包含空格的多词房间名时,天然会把整段输入按空格拆成多个独立读取单元,出现房间名错位的问题。Scanner.nextInt()读取整数后,输入缓冲区会残留用户按下回车产生的换行符。如果直接把next()换成读整行的方法,第一行读取会直接拿到空字符串,触发新的输入错位问题。
具体修正步骤
- 读取房间数量后,额外调用一次
input.nextLine()消费掉缓冲区残留的换行符,清空输入状态。 - 将循环内读取房间名的
input.next()替换为input.nextLine(),该方法会完整读取用户按下回车前的所有输入内容,支持包含空格的长字符串。
修正后的完整可运行代码
import java.util.Scanner; class Property { public static void main (String[] args) { Scanner input = new Scanner(System.in); String[] rooms = new String[15]; System.out.println("How many rooms? "); int roomLimit = input.nextInt(); // 消费nextInt()残留的换行符,避免后续读空行 input.nextLine(); for (int i = 0; i < roomLimit; i++) { System.out.println("Enter room name " + (i + 1)); // 读取整行内容,完整支持带空格的多词房间名 rooms[i] = input.nextLine(); } // 对应原有逻辑的房间列表打印 System.out.println("\nList of Chosen Rooms "); for (int i = 0; i < roomLimit; i++) { System.out.printf("Room %d: %s%n", i + 1, rooms[i]); } input.close(); } }
修正后的运行效果
How many rooms? 4 Enter room name 1 Double Duluxe Enter room name 2 Single Bed Enter room name 3 Couple Golden Enter room name 4 Master Suite List of Chosen Rooms Room 1: Double Duluxe Room 2: Single Bed Room 3: Couple Golden Room 4: Master Suite Process finished with exit code 0
避坑提示:如果跳过了消费残留换行的步骤,哪怕换成
nextLine()也会出现输入错位——输入完房间数量按下回车后,程序会直接把空字符串作为第一个房间名,让后续所有房间的输入整体往前错位一位。
内容的提问来源于stack exchange,提问作者user13322583
相关产品推荐
相关产品推荐

