Java 简单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次?当我键入任何字符

我正在阅读“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

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

我肯定你不是只按了“t”和“p”。 您按了“T”返回“P”返回。 Windows平台上的返回由两个字符表示:回车(
\r
)后跟换行符(
\n

因此,通过键入“T”return,您键入了3个字符:

  • “不”
  • \r
  • \n
  • 这就是为什么

    这不是Java的东西。如果用C或Perl编写程序,也会发生完全相同的情况


    如果您只是在中使用
    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!