在Java中,没有明显的原因跳过代码行
我正在做Y.Daniel Liang的《Java编程入门》一书中的一个练习。在这个程序中,用户可以看到一个月内有不同日期的表格。如果用户的生日在显示的表格中,则用户提示“Y”表示是,提示“N”表示否。根据用户提示“Y”的次数,程序应猜测用户的生日是当月的哪一天。当我运行程序并显示第一组日期时,我输入“Y”或“N”。然后set2和set3被打印出来,但是我没有输入任何内容。打印第4组时,我可以再次键入输入,但打印第5组后,无法键入输入。为什么我只能在set1和SET4之后输入?代码如下所示:在Java中,没有明显的原因跳过代码行,java,string,input,character,Java,String,Input,Character,我正在做Y.Daniel Liang的《Java编程入门》一书中的一个练习。在这个程序中,用户可以看到一个月内有不同日期的表格。如果用户的生日在显示的表格中,则用户提示“Y”表示是,提示“N”表示否。根据用户提示“Y”的次数,程序应猜测用户的生日是当月的哪一天。当我运行程序并显示第一组日期时,我输入“Y”或“N”。然后set2和set3被打印出来,但是我没有输入任何内容。打印第4组时,我可以再次键入输入,但打印第5组后,无法键入输入。为什么我只能在set1和SET4之后输入?代码如下所示: im
import java.util.Scanner;
public class GuessBirthday {
public static void main(String[] args)
throws java.io.IOException {
String set1 =
" 1 3 5 7\n" +
" 9 11 13 15\n" +
" 17 19 21 23\n" +
" 25 27 29 31";
String set2 =
" 2 3 6 7\n" +
" 10 11 14 15\n" +
" 18 19 22 23\n" +
" 26 27 30 31";
String set3 =
" 4 5 6 7\n" +
" 12 13 14 15\n" +
" 20 21 22 23\n" +
" 28 29 30 31";
String set4 =
" 8 9 10 11\n" +
" 12 13 14 15\n" +
" 24 25 26 27\n" +
" 28 29 30 31";
String set5 =
" 16 17 18 19\n" +
" 20 21 22 23\n" +
" 24 25 26 27\n" +
" 28 29 30 31";
int day = 0;
// Create a scanner
Scanner input = new Scanner(System.in);
// Prompt the user to answer questions
System.out.print("Is your birthday in set1?\n");
System.out.print(set1);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
char answer = (char) System.in.read();
if (answer == 'Y')
day += 1;
System.out.print("\nIs your birthday in set2?\n");
System.out.print(set2);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = (char) System.in.read();
if (answer == 'Y')
day += 2;
System.out.print("\nIs your birthday in set3?\n");
System.out.print(set3);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = (char) System.in.read();
if (answer == 'Y')
day += 4;
System.out.print("\nIs your birthday in set4?\n");
System.out.print(set4);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = (char) System.in.read();
if (answer == 'Y')
day += 8;
System.out.print("\nIs your birthday in set5?\n");
System.out.print(set5);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = (char) System.in.read();
if (answer == 'Y')
day += 16;
System.out.println("\nYour birthday is " + day + "!");
}
}
调用System.in.read()时,您从来不会实际吞食换行符,因为您使用的是
System.in.read()
。回车符(\r)和/或换行符(\n)将计为字符。因此,在第一次输入时,例如在windows上输入了“Y\r\n”,因此System.in.read()第一次将获得“Y”,下次将收到“\r”
您可以使用您实例化的扫描仪
String answer = input.nextLine();
if (answer.equals("Y") {
// blah
}
我也在想同样的事情(使用0和1是很奇怪的),所以对于在这里偶然发现的任何其他人,我让它工作了(注意-你也可以用“char”来做这件事,只要用“char”替换“String”一词即可):
如果不使用,为什么要创建
扫描仪输入
?练习是重写程序,其中整数0和1用于“否”和“是”,而将字符“Y”和“N”作为输入。实际上,我忘了在使用System.in.read()时不需要它。但你的观点是正确的,谢谢你指出这一点!
import java.util.Scanner;
public class GuessBirthday
{
public static void main( String [] args )
{
String set1 =
" 1 3 5 7\n" +
" 9 11 13 15\n" +
" 17 19 21 23\n" +
" 25 27 29 31";
String set2 =
" 2 3 6 7\n" +
" 10 11 14 15\n" +
" 18 19 22 23\n" +
" 26 27 30 31";
String set3 =
" 4 5 6 7\n" +
" 12 13 14 15\n" +
" 20 21 22 23\n" +
" 28 29 30 31";
String set4 =
" 8 9 10 11\n" +
" 12 13 14 15\n" +
" 24 25 26 27\n" +
" 28 29 30 31";
String set5 =
" 16 17 18 19\n" +
" 20 21 22 23\n" +
" 24 25 26 27\n" +
" 28 29 30 31";
int day = 0;
// Create a scanner
Scanner input = new Scanner(System.in);
// Prompt the user to answer questions
System.out.print("Is your birthday in set1?\n");
System.out.print(set1);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
String answer = input.next();
if (answer.equals("Y"))
day += 1;
System.out.print("\nIs your birthday in set2?\n");
System.out.print(set2);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();
if (answer.equals("Y"))
day += 2;
System.out.print("\nIs your birthday in set3?\n");
System.out.print(set3);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();
if (answer.equals("Y"))
day += 4;
System.out.print("\nIs your birthday in set4?\n");
System.out.print(set4);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();
if (answer.equals("Y"))
day += 8;
System.out.print("\nIs your birthday in set5?\n");
System.out.print(set5);
System.out.print("\nEnter (Y) for yes or (N) for no: ");
answer = input.next();
if (answer.equals("Y"))
day += 16;
System.out.println("\nYour birthday is " + day + "!");
}
}