为什么 java 扫描仪没有读取所有行?

Why java Scanner is not reading all the lines?

这是我的代码,它只从输入流中读取行并显示它们,但令我惊讶的是它没有读取所有行。它只读到倒数第二行。

这是我的代码:-

import java.util.*;

public class Solution {

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    short n = scan.nextShort();
    short m = scan.nextShort();
    byte[][] topics = new byte[n][m];
    for(short i = 0; i < n; i++){
        char[] arr = scan.nextLine().toCharArray();
        display(arr);

    }
}

private static void display(char[] arr){
    for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i]);
    }
    System.out.println();
  }
 }

输入以这种格式给出

  4 5
 10101
 11100
 11010
 00101

我的输出是这样的:-

 10101
 11100
 11010

它没有第三行。为什么?

在 for 循环之前添加一个 scan.nextLine(),以读取第一行的末尾(包含“4 5”)。没有它,第一次调用 scan.nextLine() 在循环 returns 一个空字符串。

问题是对 nextLine() 的第一次调用正在读取“5”结尾(读取 m)和换行符之间的空白 "line"。

就个人而言,我要么完全停止使用 Scanner(转而使用 BufferedReader)- 有很多问题有点像这样,但它的表现并不完全符合您的意愿- 或者 nextLine()。无论哪种方式,基本上一次处理一行:

  • 阅读第一行
  • 将其拆分为 space 并将两个子字符串解析为 nm
  • 阅读接下来的 n

基本上,Scanner 是 "token-oriented",而您的输入格式更 "line-oriented"。

如果您 想使用 Scanner.nextShort(),您总是可以阅读第一行(使用 BufferedReaderScanner)并从该字符串创建一个 new 扫描器:

String firstLine = ...;
Scanner firstLineScanner = new Scanner(firstLine);
short n = firstLineScanner.nextShort();
short m = firstLineScanner.nextShort();
...

问题是scan.nextLine()把这个去掉然后放 scan.next() 如果您了解 nextLine 方法,这可能会有所帮助

public 字符串 nextLine() 将此扫描器推进到当前行和 returns 跳过的输入之后。此方法 returns 当前行的其余部分,不包括末尾的任何行分隔符。该位置设置为下一行的开头。 由于此方法继续在输入中搜索行分隔符,因此如果不存在行分隔符,它可能会缓冲搜索要跳过的行的所有输入。

public class Solution 
{

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    short n = scan.nextShort();
    short m = scan.nextShort();
    short[][] topics = new short[n][m];
    for(short i = 0; i < n; i++){
        char[] arr = scan.next().toCharArray();
        display(arr);

    }
}

private static void display(char[] arr){
    for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i]);
    }
    System.out.println();
  }
 }