在 Java 中,for 循环运行 3 次,然后再进行下一次输入

2022-09-03 12:32:44

我是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循环在接受用户的另一个输入之前运行了三次?

有什么帮助吗?提前感谢您。


答案 1

我假设你使用的是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

您要做的是制作一个 ,并一次读取整行,因此您处理的唯一字符就是您输入的内容: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[]

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

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

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


答案 2

Java API:

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

发生的事情是,当你键入后跟换行符时,实际上有三个字节要读取(我猜后面跟着回车符和换行符)。因此,您提供的输入足以保持运行三次迭代。aaread()

我建议您改为用于输入读取。Scanner