Java输入缓冲区和do while循环行为(为什么它会检查第一个字符3次?)
我一直在用Oracle的“Java初学者指南”学习Java,在理解书中关于输入缓冲区和do-while循环的示例程序时遇到了困难 这个例子是关于一个数字猜测程序。它被设计为忽略您可能输入的任何额外字符。因此,如果您输入ABC,然后按enter键,它将只选中A 我的问题更多的是关于输入缓冲区,如果我注释掉处理忽略的第二个do while循环,然后运行程序,它会检查该单个字符3次。因此,如果我输入一个“a”,然后按enter键,它似乎会检查3次,我会得到“…对不起,你太低了”的输出模糊3次 如果我输入'AZ',然后按enter键,它似乎会检查4次,然后检查A,然后检查Z,然后再检查A 2次Java输入缓冲区和do while循环行为(为什么它会检查第一个字符3次?),java,loops,do-while,input-buffer,Java,Loops,Do While,Input Buffer,我一直在用Oracle的“Java初学者指南”学习Java,在理解书中关于输入缓冲区和do-while循环的示例程序时遇到了困难 这个例子是关于一个数字猜测程序。它被设计为忽略您可能输入的任何额外字符。因此,如果您输入ABC,然后按enter键,它将只选中A 我的问题更多的是关于输入缓冲区,如果我注释掉处理忽略的第二个do while循环,然后运行程序,它会检查该单个字符3次。因此,如果我输入一个“a”,然后按enter键,它似乎会检查3次,我会得到“…对不起,你太低了”的输出模糊3次 如果我输
问题:
当第二个do while循环未注释掉时,如果输入ABC然后按enter键,这是正确的顺序吗?
A–分配给ch
B-指定为忽略
C-指定为忽略
输入键(\n)–分配给忽略,循环退出,因为分配了忽略\n
如果enter键实际指定忽略,\n我有点困惑?或者它只是在等待,直到没有更多的字符可以分配给忽略?书中说按下回车键会产生换行符。因此,当:(ignore!='\n')时,do while循环终止 谢谢你的帮助
class Guess4{
public static void main (String args[])
throws java.io.IOException {
char ch, ignore, answer = 'K';
do {
System.out.println("I'm thinking of a letter between A and Z.");
System.out.println("Can you guess it: ");
//read a character
ch = (char) System.in.read();
/* discard any other characters in the input buffer
do {
ignore = (char) System.in.read();
} while(ignore != '\n');
*/
if(ch == answer) System.out.println("**Right**");
else {
System.out.print("...Sorry, you're ");
if(ch < answer) System.out.println("too low");
else System.out.println("too high");
System.out.println("Try again!\n");
}
} while(answer != ch);
}
}
class猜测4{
公共静态void main(字符串参数[])
抛出java.io.IOException{
char ch,ignore,answer='K';
做{
System.out.println(“我在想a和Z之间的一个字母”);
System.out.println(“你能猜出来吗?”);
//读一个字
ch=(char)System.in.read();
/*丢弃输入缓冲区中的任何其他字符
做{
ignore=(char)System.in.read();
}while(忽略!='\n');
*/
if(ch==answer)System.out.println(“**右**”);
否则{
System.out.print(“…对不起,您是”);
if(ch
问题1:
(正如我在评论中所写,如果我只输入了一个字符,我没有得到3行,我得到了2行,这是正确的行为)
第一个字符被多次检查的假设是错误的。要进行简单调试,请打印要测试的字符:
// ...
System.out.println("Now checking: '" + ch + "''");
if(ch == answer) System.out.println("**Right**");
// ...
现在,当您输入abc[enter]
时,您将看到每个字符都被单独处理,并且每个字符都会产生相同的消息。此外,还对新行进行了测试
问题2:
你完全正确
不过有一件很重要的事情:第二个do while构造的全部要点是清除输入流,以便进行下一次猜测!
这就是上面的注释至少试图指出的:丢弃输入缓冲区中的任何其他字符。检查换行符只是为了让您知道您可以退出循环,因为一次猜测仅限于一行!实际上你根本不需要那个忽略变量。通过读取该字符,将其从流中删除。因此,它是关于通过调用System.in.read()
来读取本身的-您不必将结果分配给任何东西
您可以将第二个do while循环替换为
do{}while(System.in.read()!='\n')代码>您确定吗?三次?当我运行它时,一切都按预期进行:如果只输入A,则会看到两行,因为第一行是A,然后是“\n”。对于ABC,您将看到4行:每个字符一行,而“\n”一行。在if子句前面添加System.out.println(“现在检查:”+ch+”)代码>查看发生了什么。@我想我得到3的原因是因为我使用了命令行。我用IntelliJ尝试了相同的代码,结果只得到2。添加代码后,额外的响应奇怪地只输出“w checking:”。书中说,按Enter键会导致回车和换行顺序。这第三个输出是回车吗?据我所知,回车键将光标移动到其左起点,而/n将光标向下移动一行。这可能解释了奇怪的第三次输出。下面是用命令行输入ABC(4个响应):我建议在代码中测试类似的理论:if(ch='\r'){…}
。请记住,许多字符不能通过打印来识别谢谢,事实证明我收到的额外回复确实是来自回车谢谢,这就清楚了很多。我不知道您可以将\n这样的值分配给char。我回复了你上面的评论,但基本上我使用的是命令行,这似乎就是为什么我会得到额外的响应/运行。以下是进入ABC并获得4条回复的屏幕截图:。注意奇怪的“w检查:”输出,我怀疑可能是回车?(w前面的“实际上是两个”)。你在使用windows吗?因为在windows中,换行符是通过发送两个转义序列来表示的:\r
,后跟\n
…编辑:刚才看到了你上面的评论。。。