StdIn 将换行符读取为 char

StdIn reads line break as char

我正在尝试获取用户输入(来自普林斯顿 Java 课程的 StdIn)并将其保存到 char[][] 中。输入采用以下格式:

0.........
1.........
2.........
3.........
4.........
..........
.........3
.........2
.........1
.........0

当我在 cmd 中使用 javac 编译和 运行 我的代码时,它可以正常工作并正确打印格式化的数组,但是它在 Eclipse 中变得一团糟。 这是我使用的代码:

    int row = 10;
    int col = 10;
      char[][] input = new char[row][col];
      for(int i = 0; i<10; i++) {
          for (int j = 0; j<10; j++) {
              input[i][j] = StdIn.readChar();
          }
      }
      for (int i = 0; i<10; i++) {
          for (int j = 0; j<10; j++) {
              System.out.print(input[i][j]);
          }
          System.out.println();
      }

应该以与输入相同的格式打印数组。

编辑:我发现了问题:StdIn.readChar() 还将换行符读取为单个字符并用它填充数组。有没有一种优雅的方法来防止这种情况?

您可以只使用扫描仪。 https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

Scanner sc = new Scanner(System.in);
String line = sc.nextLine();

这样,您将获得没有任何 CR 或 LF 字符的行。

您应该检查 Carriage Return (CR) 或 Line Feed (LF) 字符,在 Windows 主机中,换行符使用 CR+LF,在 Linux 中仅使用如果。 使用 System.getProperties("line.separator")System.lineSeparator() 您将获得一个字符串,其中包含用于开始新行的字符,具体取决于您的 OS.

但您可以使用 java.util.Scanner 或 java.io.BufferedReader

简化此过程

扫描仪示例:

int row = 10;
int col = 10;
char[][] input = new char[row][col];
Scanner in = new Scanner(System.in);
for(int i=0; i < row; i++){
    input[i] = in.nextLine().toCharArray();
}

使用 BufferedReader 的示例(您还需要导入 java.io.InputStreamReader 并且使用的方法可能会抛出 IOException,所以我认为使用 Scanner 更简单,但是,如果您愿意...)

int row = 10;
int col = 10;
char[][] input = new char[row][col];
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i < row; i++){
    input[i] = reader.readLine().toCharArray();
}

两种实现方式很相似,你可以选择你喜欢的一种,我觉得检查每个字符是否与CR("\r") and/or与LF("\ n")