Java中的for循环在下一次输入之前运行3次

我是Java的新手并且正在学习它。 我正在尝试使用代码来实际查看for-each循环如何在Java中工作。 但我遇到了一个问题。 我的代码很简单:

class ForEach { public static void main(String[] args) throws java.io.IOException { char[] array = new char[10]; for(int i = 0; i < 10; i++) { System.out.println("Enter Character " + i); array[i] = (char)System.in.read(); } System.out.println("Displaying characters in array : "); for(char i : array) { System.out.println(i); } } } 

但输出很尴尬。 我确信我的代码有问题。 我不能找到它。 此代码的输出是:

 Enter Character 0 a Enter Character 1 Enter Character 2 Enter Character 3 b Enter Character 4 Enter Character 5 Enter Character 6 c Enter Character 7 Enter Character 8 Enter Character 9 d Displaying characters in array : a b c d 

我不明白为什么for循环在需要用户的另一个输入之前运行三次?

有帮助吗? 先谢谢你。

我假设你在Windows上,因为这种行为似乎适合Windows。

当你输入一个角色时,你会做这样的事情:

  1. a
  2. 返回

步骤2传递一个行分隔符序列,该序列向输入控制台指示您已按Enter键,这告诉控制台您已完成输入此行的输入。 因此控制台将整行传递给您的程序。

Windows上的这一行分隔符序列由回车符'\n'后跟换行符'\n' 。 所以你的行真的"a\r\n"

System.in.read()所做的是从输入控制台读取一个字节。 由于你输入的字符都适合单个字节,你的程序所做的就是逐个消耗输入的字符,所以它是这样的:

 Output: Enter Character 0 > User inputs: "a\r\n" // You only entered 'a', the other two characters are from the enter key array[0] = System.in.next(); // sets array[0] to 'a', "\r\n" are still "waiting" on the input stream Output: Enter Character 1 > String "\r\n" is still on input, so read from those: array[1] = System.in.next(); // sets array[1] to '\r', "\n" is still "waiting" Output: Enter Character 2 > String "\n" is still on input, so read from that array[2] = System.in.next(); // sets array[2] to '\n', input source is now empty Output: Enter Character 3 > Nothing is waiting on the input stream, so program waits for user input ... and so on 

您想要做的是制作Scanner ,并一次读取整行,因此您处理的唯一字符就是您输入的内容:

 Scanner scanner = new Scanner(System.in); // Creates a new scanner that reads from System.in String line = scanner.nextLine(); // Reads an entire line from console, **not including newline breaks at the end of a line** // use line.charAt(i) to get individual characters, or use line.toCharArray() to get the string's backing char[] 

如果要打印数组中每个元素的整数值,您实际上会看到控制台输出空行的数字。 这些数字是'\r''\n'字符的ASCII数字等价物。

有趣的是,我相信如果你在* nix系统上运行它,你只会跳过一行而不是两行。 这是因为* nix系统仅使用'\n'作为行分隔符,因此您只需在行尾添加一个额外字符。

另外,我不完全确定你的控制台为'\r''\n'输出一行'\n' ; 可能是Java内部断开了两个字符的行,而Windows却没有。 因此,如果您尝试在Windows shell中运行此操作,甚至可能会得到不同的结果。

从Java API :

从输入流中读取下一个数据字节。

当你输入a后跟换行符时会发生什么,实际上有三个字节要读(我猜a后跟回车符和换行符)。 因此,您提供的输入足以使read()运行三次迭代。

我建议您使用Scanner进行输入读取。