Scanner类的 sc.nextInt()和sc.nextLine()中间为啥要多加一个sc.nextLine()?

496 阅读1分钟

起因:

在刷算法题的时候经常需要输入数据、这里就会用到 Scanner、看题解的时候就会发现、调用sc.nextInt()后就会空调用一次sc.nextLine()、才使用sc.nextLine()读取输入的字符串;

举例

Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
double y = sc.nextDouble();
sc.nextLine();  /*to flush the character \n left by method nextDouble()*/
String s = sc.nextLine();
System.out.println("String: " + s);
System.out.println("Double: " + y);
System.out.println("Int: " + x);

原因

这是由于nextLine()会读取\n之前的所有内容,并去除\n、而nextDouble()等曾不会去除它后面的\n。

具体工作流程

如果一次输入一个整数、浮点数和字符串
42
3.1415
Hello World!

用户的输入在计算机缓冲区中是这样存储的:42\n3.1415\nHello World!\n
使用nextInt()读取42结束、剩下\n3.1415\nHello World!
使用nextDouble()读取3.1415、剩下\nHello World!
如果此时直接用nextLine()读取、该函数遇到换行符\n就结束而丢掉Hello World!
所以需要在这之前输入nextLine()、去掉缓冲区的\n、然后再读取才是Hello World!

参考 blog.csdn.net/csdn_952766…