解决Scanner读取输入时出错:nextInt()后的nextLine()问题及原理
遇到的问题是:昨天在写一个算法题时,需要先输入一个数字,接着再输入与该数字个数相同的字符串。

创建一个 Scanner 对象,该对象用于从 System.in 中获取输入。
int n = scanner.nextInt();
创建了一个名为 strArr 的字符串数组,其长度为 n 。
for (int i = 0; i < n; i++) {
strArr[i] = scanner.nextLine();
}
如此使用,发现会出错
原因是想当然的使用了nextLine()来读取
改进方式:使用next()
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[] strArr = new String[n];
for (int i = 0; i < n; i++) {
strArr[i] = scanner.next();
}
或者 全部使用nextLine()
Scanner scanner = new Scanner(System.in);
扫描仪读取一行内容并赋值给字符串 StrN 。
获取字符串 StrN,然后将其转换为整数类型并赋值给变量 n,具体是通过调用 Integer.parseInt 方法来实现的。
String[] strArr = new String[n];
for (int i = 0; i < n; i++) {
strArr[i] = scanner.nextLine();
}
原因:
Scanner 是一个扫描器,它从内存中的一块缓冲区进行数据扫描并读入数据。我们在控制台输入的数据会先被存入缓冲区,等待扫描器的扫描读取。在扫描过程中,这个扫描器判断停止的依据是“空白符”,像空格、回车等都属于空白符。
nextInt()方法在扫描到空白符时会读取前面的数据,同时会将空白符"\r"留在缓冲区中。空格、换行等都属于空白符,而 nextLine()会继续读取本行的空白符。
Java 中 Scanner 类有 nextInt()方法、nextLine()方法和 next()方法。这三种方法存在一些区别。nextInt()用于获取整数输入。nextLine()用于获取一行字符串输入。next()用于获取以空格分隔的单词作为输入。它们在获取输入的类型和方式上有所不同。
nextInt()会读取一个整数,其类型为 int。同时,它会把空白符留下,这意味着焦点不会移动到下一行,而是仍在当前这一行。
nextLine() 会读取该行所剩余的全部内容,其中包含换行符。接着,它会把焦点移动到下一行的起始位置。
next()是通过换行或者空白符来接收下一个 String 类型的变量。
此方法带有一个 String 类型的数组参数 args。
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
获取用户输入的一行字符串,将其赋值给变量 str 。
System 输出了这样的内容:"nextInt()整数:" 加上 x 。
System.out.println("nextLine() 所获取的字符串为:" + str);
String s = scanner.next();
scanner.close();
12
nextInt()整数:12
nextLine()字符串:
12
next()字符串:12
由此可见,nextLine()所接收的是第一个 12 之后的换行符。