java键盘录入的区别:
第一套体系:遇到空格、回车结束本次输入,并且本次输入不接收空格和回车
- nextInt()、nextDouble()、next() 遇到空格、回车就结束本次输入,只接收空格和回车之前的数据内容,空格以及空格之后的数据(包括回车)都在缓冲区内,如果有下一个待输入的变量值,会将缓冲区内的值传递给下一个变量,但是不会接收缓冲区内的空白、回车字符
举例:两个nextInt()可以连着用
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt(); // 输入 "123 321\n",读取123,缓冲区剩余 " 321\n"
int num2 = sc.nextInt(); // 读取 321(跳过空格),缓冲区剩余 "\n"
System.out.println(num1); // 输出 123
System.out.println(num2); // 输出 321
解释: 第一个输入123 321 回车,缓冲区内是 321 回车,由于缓冲区内已经有值了,所以会直接交给第二个变量,由于nextInt()不会接收空格和回车,所以直接输出321;连续使用 nextInt() 是安全的,因为会忽略缓冲区中的前导空白字符(比如空格)
第二套体系:遇到回车结束本次输入,并且接收空格和回车
- nextLine():本次输入接收空格(和残存在缓冲区内的回车),回车结束输入,回车不会放在缓冲区内
举例:nextLine不会将回车放入缓冲区
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine(); //输入123 234
String s2 = sc.nextLine(); //输入999 888
System.out.println(s1); //输出123 234
System.out.println(s2); //输出999 888
//证明了nextLine不会将\n放入缓冲区导致下一个nextLine无法正常输入
nextInt()和nextLine()不可以混着用:因为nextInt会将回车放入缓存区,nextLine可以读入缓存区内的回车,导致无法输入正确的值
Scanner sc = new Scanner(System.in);
int num = sc.nextInt(); // 输入 "3\n",读取3,缓冲区剩余 "\n"
String name = sc.nextLine(); // 读取到残留的 "\n",name 为 ""(空字符串)
System.out.println(name); // 输出空行
//因为nextInt输入的回车放在缓冲区,nextLine会读入回车,直接结束
解决办法:可以在每次输入完之后使用nextLine()清除一下缓存区
int num = sc.nextInt(); // 输入 "3\n",读取3,缓冲区剩余 "\n"
sc.nextLine(); // 清除缓冲区的 "\n"
String name = sc.nextLine(); // 正常等待输入
PS:第一套体系相当于c++的cin,第二套体系相当于c++的getline