丢弃输入缓冲区中的字符?

时间:2015-08-29 15:19:15

标签: java

我正在阅读java书的介绍,我在这一节涉及do while循环。这是代码:

public class GuessingGameV4 {

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

        char ch, ignore, answer;

        answer = 'K';

        do {
            System.out.println("I am thinking of a letter between A and Z");
            System.out.println("Can you guess it?");

            ch = (char) System.in.read();

            do {
                ignore = (char) System.in.read();
            } while (ignore != '\n');

            if (ch == answer) System.out.println("Right!!! ");
            else {
                System.out.print("Sorry you are ");
                if (ch < answer) System.out.print("too low.\n");
                else System.out.print("too high.\n");

                System.out.println("Try again\n");
            } 
        } while (answer != ch);
    }
}

涉及忽略的内部do while循环是丢弃输入缓冲区中字符的代码部分。

我只是想要更多地澄清它实际上在做什么,因为书籍的解释不适合我。

2 个答案:

答案 0 :(得分:2)

我想这是给你带来麻烦的部分:

System.out.println("I am thinking of a letter between A and Z");
System.out.println("Can you guess it?");

ch = (char) System.in.read();

do {
    ignore = (char) System.in.read();
} while (ignore != '\n');

该程序要求用户输入一个字母。 但是System.in被缓冲了。 用户实际上可以键入多个字符。 即使是长句。 直到最后他按下Enter,即字符'\n'

该程序将一个字符读入ch

ch = (char) System.in.read();

然后它会更进一步,并继续阅读,直到找到'\n'字符:

do {
    ignore = (char) System.in.read();
} while (ignore != '\n');

如果你不这样做, 然后,用户输入的任何额外输入将被转移到外循环的下一次迭代。 你不希望遗留任何东西, 你只想输入第一个字符, 丢弃其余的, 所以在下一次迭代中,你要从一个干净的缓冲区开始。

尝试使用ignore注释掉的循环代码。 如果输入一个字母, 外循环将运行两次, 对于您输入的字母和结束输入的'\n'字符。 如果输入多个字母, 让我们说“你好”, 循环将运行6次, 字母h-e-l-l-o为5次,结束输入的'\n'字符再用一次。

- &GT;清除输入缓冲区需要使用ignore的循环。

答案 1 :(得分:0)

这是一个奇怪的例子。

会说“对!​​!!”回答:

Its definitely not K\n

因为它会忽略您输入的行中的最后一个字符,并将最后一个字符与answer变量中的字符进行比较。

更新:实际上它会忽略除第一个角色之外的所有角色。抱歉。所以它应该是

K is definitely not the answer\n

我想它可以像在windows下一样处理行尾的\ r \ n。 (回车)