我正在阅读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循环是丢弃输入缓冲区中字符的代码部分。
我只是想要更多地澄清它实际上在做什么,因为书籍的解释不适合我。
答案 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。 (回车)