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);
}
}
格式化仍然很糟糕吗?
答案 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确保只提取第一个字符。