由上一篇博客中所出现的问题进行以下试验与整理
例如以下代码:
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextLine();
}
System.out.println(Arrays.toString(arr));
}
}
若直接运行该代码,运行结果如下:
即未输入arr[2],程序就直接输出了该数组,故猜想应该是数组的第1个元素即arr[0]被系统写入了一个空字符或者转义字符之类的。
我们将代码做以下改变
package xxxx;
import java.util.*;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextLine();
}
System.out.println(Arrays.toString(arr));
System.out.println(arr[0]);
System.out.println(arr[2]);
}
}
此次运行结果如下图所示:
由以上运行结果,我们可知,的确是数组的第一个元素为换行符\n。
据官方文档所述:
nextInt(): it only reads the int value, nextInt() places the cursor in
the same line after reading the input.(此方法只读取整型数值,并且在读取输入后把光标留在本行)
next(): read the input only till the space. It can’t read two words
separated by space. Also, next() places the cursor in the same line
after reading the input.(读取输入直到遇见空格。此方法不能读取被空格分隔开的内容,并且在读取输入后把光标留在本行)
nextLine(): reads input including space between the words (that is,
it reads till the end of line \n). Once the input is read, nextLine()
positions the cursor in the next line.(读取包括空格在内的输入,而且还会读取行尾的换行字符\n,读取完成后光标被放在下一行)
nextLine()方法如其名,会读取当前这一整行包括换行符。
每一次读取过程是从光标位置开始的。所以,一开始那个程序当我们输入3并按下回车,由于nextInt()方法只读取数值而不会读取换行符,所以光标停在了3和\n之间,然后for循环中的第一次nextLine()方法把3后面的换行符\n读取掉了,并把光标弹到下一行,这个时候才开始读取你输入的a字符。最后,才造成了arr[0]的内容其实是一个换行符。
我们将程序做以下改变:
package xxxx;
import java.util.*;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String a=sc.nextLine(); //读掉其换行符
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextLine();
}
System.out.println(Arrays.toString(arr));
}
}
此时运行结果如下: