在下面的代码中,为什么println方法中的字符串会显示两次,我该怎么做才能在每次迭代中显示一次消息
package practicejava;
public class Query {
public static void main(String[] args) throws java.io.IOException {
System.out.println("Guess a capital letter Character");
while ((char) System.in.read() != 'S') {
System.out.println("wrong.guess again to finish the program");
}
}
}
答案 0 :(得分:1)
当用户输入控制台字符时,要确认已准备好将其输入传递给应用程序,请按 enter 键。但是,控制台不会仅传递所提供的字符,还会在其后添加到输入流(System.in)与操作系统相关的line separator字符。某些操作系统使用\r
或\n
(这些是单个字符,\x
只是表示它们的符号),而其他操作系统,例如Windows,则使用\r\n
(两个字符)序列作为行分隔符。
现在,System.in.read()
还会读取这些附加字符,由于它们不等于S
,System.out.println("wrong.guess again to finish the program");
将执行额外的时间。
为避免此类问题,而不是通过System.in.read()
处理原始数据,请考虑使用像java.util.Scanner
这样的类,使我们的生活更轻松
Scanner sc = new Scanner(System.in);
System.out.println("Guess a capital letter Character");
String response = sc.nextLine();
while(!response.equals("S")){
System.out.print("incorrect data, please try again: ");
response = sc.nextLine();
}
答案 1 :(得分:0)
这是因为您读取的第一个字符是您键入的字母,然后有第二个循环,其中的字符是换行符。
例如,在我的Linux机器上,如果我输入“ E”然后按Enter,则第一个循环处理char 69'E',然后有第二个循环处理回车(char 10)。 / p>
答案 2 :(得分:0)
您可以使用Scanner
来获取用户的输入:
package practicejava;
import java.util.Scanner;
public class Query {
public static void main(String[] args) throws java.io.IOException {
Scanner s = new Scanner(System.in);
char c;
do {
System.out.println("Guess a capital letter Character");
c = s.next().charAt(0);
if (c != 's') {
System.out.println("Wrong! Guess again to finish the program.");
}
} while(c != 's');
}
}
s.next()
将作为字符串从用户那里得到输入,而s.next().charAt(0)
将返回该字符串中的第一个字符。