我是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.
当你输入一个角色时,你会做这样的事情:
步骤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中运行此操作,甚至可能会得到不同的结果.
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |