我正在处理“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次?当我输入任何字符时,它输出:
Press S to stop.
T
Pass #0
Pass #1
Pass #2
P
Pass #3
Pass #4
Pass #5
我希望它运行一次然后等待下一个输入。
答案 0 :(得分:9)
我确定你没有按下“T' T'和' P'。
你按下了' T' 返回' P' 返回。
Windows平台上的 return 由两个字符表示:回车(\r
)后跟换行符(\n
)。
所以输入' T' return 您键入了3个字符:
\r
\n
这就是原因。
它不是Java的东西。如果你用C或Perl编写程序,那么就会发生同样的事情。
如果您只是使用System.in
,则无法在大多数控制台上获得单独的按键 - 而是在返回之前您无法获得任何数据被压了。您可以编写GUI应用程序,而不是希望更详细地了解关键按键。
答案 1 :(得分:2)
如前所述,额外的迭代代表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上一样。有关详细信息,请参阅the wikipedia article for Newline。
java语言为此提供了一个有用的抽象,您可以在更复杂的代码中使用:标准库在EOL
中捕获System.lineSeparator
的与操作系统相关的值,请参阅{{的文档1}} here
答案 2 :(得分:1)
如果你想让它像你期望的那样工作,你可以使用像这样的扫描仪:
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