1

我在使用以下代码时遇到问题:

public class DWDemo {
  public static void main(String[] args) throws java.io.IOException {
    char ch;

    do {
      System.out.print("Press a key followed by enter: ");
      ch = (char) System.in.read(); // get the char
    } while (ch != 'q');
  }
}

出于某种原因, System.out 行重复了 3 次。控制台的示例输出如下:

Press a key followed by enter: a
Press a key followed by enter: Press a key followed by enter: Press a key followed by enter: 

我已经在 Eclipse Kepler 中尝试过这段代码,并在手动编译时遇到了同样的问题。事实证明,谷歌搜索答案是徒劳的。有什么想法吗?

添加了正确的代码

如果我输入超过 1 个字符,我会得到 4 个 System.out.println 结果:

Press a key followed by enter: aa 
Press a key followed by enter: Press a key followed by enter: Press a key followed by     enter: Press a key followed by enter: 
4

2 回答 2

7

所以你按 a 并回车。然后你会读到这些字符

  • 字符“a”
  • 字符 '\r'
  • 字符'\n'

(这适用于 Windows,例如在 *nix 系统上,换行符只是一个 '\n' 而不是 \r\n)

您可以跳过所有空格:

 do {
   System.out.print("Press a key followed by enter: ");
    ch = (char) System.in.read(); 
    while(Character.isWhitespace(ch)) {
        ch = (char) System.in.read(); 
    }
} while (ch != 'q');
于 2013-08-27T21:27:25.567 回答
2

当您按下回车键时,它会在基于Windows的系统中读取两个额外的字符 (\r\n)。

如果您将代码更改为:

    do {
        System.out.print("Press a key followed by enter: ");
        ch = (char) System.in.read(); // get the char
        char ch1 = (char) System.in.read(); // carriage return
        char ch2 = (char) System.in.read(); // line feed
    } while (ch != 'q');

它将打印单个“按一个键,然后输入:”

如果要交叉验证,打印 和 的 int 值ch1ch2您将分别得到1310

于 2013-08-27T21:29:32.660 回答