Java do-while循环跳过控制台输入

时间:2016-06-05 15:43:33

标签: java do-while system.in

class Noob1 {
    public static void main(String args[]) 
        throws java.io.IOException{

        char ch, answer;
        answer = 'g';

        do {
            System.out.println("Guess from A-L:");
            ch = (char) System.in.read();
                if(ch == answer){
                    System.out.println("Congratz!");
            } else System.out.println("Try again!");
        } while (ch != answer);
    }
}

输出是这样的:

Guess from A-L:
a
Try again!
Guess from A-L:
Try again!  // this is where intuitively it should ask for input again
Guess from A-L:
Try again!
Guess from A-L:
g           //  input is skipped a few times
Congratz!

我无法弄明白为什么,我正在为初学者读一本书,一切都应该被覆盖,我缺少什么?

在循环结束时添加以下代码,确认它已被循环但输入以某种方式被跳过。

i++;
System.out.println(i);

所以我用它来工作:

import java.io.*;

class Noob1 
{
    public static void main(String args[]) throws java.io.IOException
    {
        char ch, answer;
        String tmp;
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        answer = 'g';

            do 
            {
                System.out.println("Guess character followed by ENTER:");
                tmp = bufferedReader.readLine();
                ch = tmp.charAt(0); // only first char is considered
                if (ch == answer) 
                    System.out.println("Gratz! the answer was: " + ch + "!");
                else 
                    System.out.println("Nope, try again..");
            } while (ch != answer);
    }
}

格式化仍然很糟糕吗?

2 个答案:

答案 0 :(得分:3)

ess只会读取一个字符,但在回答时,您会输入多个字符:您正在键入read ,然后输入换行符,因为在您按Enter键之前,控制台输入不会被发送到流。该换行符位于流中,等待下一个a读取,这就是为什么它不会等待您再次输入内容。

你可能希望将read包裹在System.in中并使用BufferedReader#readLine并处理你得到一个字符串而不是一个字符的事实,或者在获得你的角色之后,调用{{重复1}}直到你得到换行符。我选择BufferedReader

答案 1 :(得分:1)

您一次输入2个字符 - 字符本身和'\ n'新行字符。用以下内容替换你读取字符的实现:

Scanner s= new Scanner(System.in);
char x = s.next().charAt(0);

charAt确保只提取第一个字符。

相关问题