Java 简单For循环-执行次数过多
我正在阅读“Java:初学者指南第6版”中的一段代码。我所讨论的部分是解释实现For循环的不同方法Java 简单For循环-执行次数过多,java,for-loop,Java,For Loop,我正在阅读“Java:初学者指南第6版”中的一段代码。我所讨论的部分是解释实现For循环的不同方法 // Loop until an S is typed. System.out.println("Press S to stop."); for(int i = 0; (char) System.in.read() != 'S'; i++) System.out.println("Pass #" + i); 我的问题是-为什么它在请求新的键盘输入之前执行3次?当我键入任何字符
// Loop until an S is typed.
System.out.println("Press S to stop.");
for(int i = 0; (char) System.in.read() != 'S'; i++)
System.out.println("Pass #" + i);
我的问题是-为什么它在请求新的键盘输入之前执行3次?当我键入任何字符时,它会输出:
Press S to stop.
T
Pass #0
Pass #1
Pass #2
P
Pass #3
Pass #4
Pass #5
我希望它运行一次,然后等待下一个输入 我肯定你不是只按了“t”和“p”。 您按了“T”返回“P”返回。 Windows平台上的返回由两个字符表示:回车(
\r
)后跟换行符(\n
)
因此,通过键入“T”return,您键入了3个字符:
\r
\n
如果您只是在中使用
System.in,那么在大多数控制台上都不可能获得单独的按键操作-相反,在按下返回键之前,您不会获得任何数据。您可以编写GUI应用程序,而不必对按键操作有更详细的了解。如果您想让它按预期工作,可以使用如下扫描仪:
Scanner scanner = new Scanner(System.in);
System.out.println("Press S to stop.");
for(int i = 0; scanner.next().charAt(0) != 'S'; i++)
System.out.println("Pass #" + i);
这将产生以下输出:
Press S to stop.
W
Pass #0
R
Pass #1
T
Pass #2
S
如前所述,额外的迭代表示EOL
或行尾字符。当您键入一个字符作为输入时,您需要键入一个额外的字符来传递程序的标准输入:可能是Enter键
为了更清楚地了解这一点,以下是对代码的简单修改:
// Loop until an S is typed.
System.out.println("Press S to stop.");
char read;
for (int i = 0; (read = (char) System.in.read()) != 'S'; i++)
{
System.out.print("Pass #" + i);
// specific checks for LF \n, or CR \r
if (read == '\n')
System.out.println("; char read was: \\n");
else if (read == '\r')
System.out.println("; char read was: \\r");
else System.out.println("; char read was: " + read);
}
输出:
Press S to stop.
T
Pass #0; char read was: T
Pass #1; char read was: \r
Pass #2; char read was: \n
P
Pass #3; char read was: P
Pass #4; char read was: \r
Pass #5; char read was: \n
S
从我的输出和你的输出,我们可以很好地猜测我们正在运行这个循环的系统是基于Wndows的系统。请注意,不同的操作系统以不同的方式表示此字符:因此,当您在基于UN*X的系统(如mac)上运行代码时,应该期望看到不同的输出。有关更多信息,请参阅
java语言对此做了一个有用的抽象,您可以在更复杂的代码中使用:标准库捕获系统中EOL
的与操作系统相关的值。lineSeparator
,请参阅lineSeparator
副本的文档:感谢Erwin以如此彻底的,深刻的解释!我必须更深入地研究扫描仪的功能。谢谢分享,swingMan!