重复输出

时间:2014-02-22 13:43:56

标签: java io console

为什么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。接下来的事情是我使用无限循环强制输入请求特定字符,直到它正确的字符。

4 个答案:

答案 0 :(得分:2)

当您在命令行中输入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;
}

答案 1 :(得分:0)

    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");
        }
    }
}

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

答案 2 :(得分:0)

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

如果您想将整数作为输入,则可以使用此代码int i = new Scanner(System.in).nextInt();

请参阅此Question for more information

答案 3 :(得分:0)

  

read()不读取数字,它读取一个字节并返回其值   作为一个int。如果你输入一个数字,你会得到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() 轻松完成,正如其他人提到的那样,并轻松找到下一个int数字,但要小心,{{1以不同的方式工作,它检查标记而不是字符,这意味着分隔符默认为空格Scanner)。因此,如果您输入" "(并按 Enter ),则会将其转换为数字57

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

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