我是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循环在从用户那里获得另一个输入之前运行三次?
有任何帮助吗?提前谢谢。
答案 0 :(得分:27)
我假设您使用的是Windows,因为这种行为似乎适合Windows。
当你输入一个角色时,你会这样做:
步骤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
进行输入阅读。