【问题标题】:Duplicate output重复输出
【发布时间】:2014-02-22 13:43:56
【问题描述】:

为什么Number lower than 9 在我的控制台中打印了两次,在下面的代码示例中?

public static void main(String[] args) throws java.io.IOException {
    System.out.println("Input from keyboard should be '49'");
    char e;
    for (int a = 0; ; a++) {
        e = (char) System.in.read();
        if (e == 49)
            break;
        else
            System.out.println("Use number lower than 9");
    }
}

这是当您键入除数字 1 之外的任何内容时的输出:

run:
Input from keyboard should be '49'
2
Number lower than 9
Number lower than 9

编辑

基本上,我正在尝试从控制台获取输入并将其存储在char e 中。我输入1 后得到的是值49。这就是我在上面的代码中使用e == 49 的原因。我不知道如何只检索字符1。接下来是我使用无限循环来强制输入要求特定字符,直到它正确为止。

【问题讨论】:

标签: java io console


【解决方案1】:

当您在命令行中输入2 时,实际上是在输入2\n\n 是换行符),因为您通过按Enter 来确认您的输入返回

System.in.read() 因此在第一个循环循环中返回 2,在第二个循环循环中返回换行符,每次都在标准输出上打印您的消息。

你可以通过跳过换行符来解决这个问题:

for (int a = 0; ; a++) {
    e = (char) System.in.read();
    if (e == '\n')
        continue;
    if (e == 49)
        break;
    else
        System.out.println("Use number lower than 9");
}

但还有一些问题:您想要实现什么目标?如果在基于字符的级别上比较输入,49 不等于数字 49,而是等于代码为 49 的字符,即字符 '1'

其次,如果你正在构建一个无限循环,你也应该这样写。 for 循环给人的印象是,循环将根据您的int a 留下,但事实并非如此。要写一个无限循环,你可以写:

while (true) {
    // do something
    if (checksomething())
        break;
}

【讨论】:

    【解决方案2】:
        public static void main(String[] args) throws java.io.IOException {
        System.out.println("Input from keyboard should be '49'");
        char e;
        Scanner s=new Scanner(System.in);
        for (;;) {
            e = s.next().charAt(0);
            if (e == 49){
                System.out.println("Yay");
                break;
            }else{
                System.out.println("Use number lower than 9");
            }
        }
    }
    

    你可以只扫描字符串,但如果你需要字符,上面的代码可以工作

    【讨论】:

      【解决方案3】:

      您的程序输出显示 数字低于 9,因为它 System.in.read() 返回输入的第一个字符的 ASCII 值,即 '2' 而不是 49,而是 50。

      如果你想要整数作为输入,你可以使用这个代码int i = new Scanner(System.in).nextInt();

      参考这个Question for more information

      【讨论】:

        【解决方案4】:

        read() 不读取数字,它读取一个字节并返回其值 作为一个整数。如果你输入一个数字,你会得到 48 + 那个数字,因为 数字 0 到 9 在 ASCII 中的值是 48 到 57 编码。

        source

        for (;;) {
            int e = System.in.read(); // char e = (char)System.in.read();
            if (e == 49) // if (e == '1')
                break;
            else
                System.out.println("You entered something else than character 1");
        }
        

        Enter 被计为一个字符,因此另一个字符条目。

        如果你想存储只是字符1,则没有强制转换的意义。

            if (e == 49) {
               //Presume that is character `1` and do what operation you want as it is.
               System.out.println("You enter number 1");
            }
        

        相反,您应该检查输入是否正确,然后将其转换为字符。您可以通过检查输入是否介于4857 之间来检查输入是否为数字正如我在报价中所写的请记住,如果您输入例如57 算作两个输入(5 和 7)

            char ch; int e;
            if (e >= 49 && e <= 57) {
               ch = (char)e;
               System.out.println("You enter number " + ch);
            }
        

        这一切都可以通过Scanner.nextInt() 轻松完成正如其他人提到的,它会转换并轻松发现下一个整数,但要小心Scanner 的工作方式不同,它检查标记而不是字符,这意味着分隔符默认为空格 (" ")。因此,如果您输入 57(然后按 Enter),它会将其转换为数字 57

        方便的是,如果您输入dogs 57(并按Enter),它仍将作为输入57 并跳过dogs。另一个方便的方法是hasNextInt(),因此您可以在while 循环中使用它来获取多个数字输入。

        您也可以更改分隔符useDelimiter(),如果要获取它的字符,请将其设置为("") 空字符串

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-06
          • 2013-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多