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

Saj*_*rya 15 java for-loop

我是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);
    }
}
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我不明白为什么for循环在从用户那里获取另一个输入之前运行三次?

有帮助吗?先感谢您.

awk*_*ksp 27

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

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

  1. a
  2. return

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

Windows上的此行分隔符序列由回车符'\r'后跟换行符组成'\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
Run Code Online (Sandbox Code Playgroud)

你想要做的是做一个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[]
Run Code Online (Sandbox Code Playgroud)

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

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

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