简单的For循环 - 执行太多次IMO

时间:2015-05-16 14:00:08

标签: 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次?当我输入任何字符时,它输出:

Press S to stop.

T

Pass #0

Pass #1

Pass #2

P

Pass #3

Pass #4

Pass #5

我希望它运行一次然后等待下一个输入。

3 个答案:

答案 0 :(得分:9)

我确定你没有按下“T' T'和' P'。 你按下了' T' 返回' P' 返回。 Windows平台上的 return 由两个字符表示:回车(\r)后跟换行符(\n)。

所以输入' T' return 您键入了3个字符:

  1. ' T'
  2. \r
  3. \n
  4. 这就是原因。

    它不是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