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

时间:2014-05-18 08:45:00

标签: 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);
    }
}
}

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

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循环在从用户那里获得另一个输入之前运行三次?

有任何帮助吗?提前谢谢。

2 个答案:

答案 0 :(得分:27)

我假设您使用的是Windows,因为这种行为似乎适合Windows。

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

  1. a
  2. 返回
  3. 步骤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
    

    您要做的是制作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'输出一行的原因;可能是Java内部断开了两个字符的行,而Windows却没有。因此,如果您尝试在Windows shell中运行它,您甚至可能得到不同的结果。

答案 1 :(得分:1)

来自Java API

  

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

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

我建议您改为使用Scanner进行输入阅读。