我如何一次接受来自 System.in.read() 的输入?我究竟做错了什么?
How do I one at a time, accept inputs from System.in.read()? What am I doing wrong?
该程序旨在一次接受来自用户的输入 1,以制定 FizzBuzz(计数到 100。计数时,如果数字可以被 3 整除,则说 Fizz。如果它可以被整除5, say Buzz instead. If it is divided by both, say FizzBuzz.) game after complete.第一个输入是长度的第一个数字,第二个输入第二个数字,第三个输入第三个数字。接下来的两个输入将是 Fizz 和第二个 Buzz。但是,在程序中输入第一个字符后,会打印两次?我不明白我的脚本发生了什么。这是我的程序(使用eclipse,如果你需要知道)
public class Game {
public static void runFizzBuzz(int length1, int length2, int length3, int fizz, int buzz) {
String out = ""; //what to print
int foo = length1 * 100 + length2 * 10 + length3; //turns 3 digits into 3 digit num for program to read
for(int i = 0; i <= foo; i++) {
out = ""; //resets out
if(i % fizz == 0) {
out += "Fizz";
}
if(i % buzz == 0) {
out += "Buzz";
}
if(out == "") { //if neither of the above conditions pass, it will just do the number i
out += String.valueOf(i);
}
System.out.println(out); //prints solution
}
}
public static void main(String[] args)
throws java.io.IOException {
//parameters that System.in.read() should change
int param1a; //digit 1 of length
int param1b; //digit 2 of length
int param1c; //digit 3 of length
int param2; //fizz
int param3; //buzz
System.out.println("Param 1 digit 1 (length)");
param1a = (char) System.in.read();
System.out.println("Param 1 digit 2 (length)");
param1b = (char) System.in.read();
System.out.println("Param 1 digit 3 (length)");
param1c = (char) System.in.read();
System.out.println("Param 2 (fizz)");
param2 = (char) System.in.read();
System.out.println("Param 3 (buzz)");
param3 = (char) System.in.read();
System.out.println("Press e to exe"); //when i press e, print fizzbuzz game
if((char) System.in.read() == 'e') {
runFizzBuzz(param1a,param1b,param1c,param2,param3);
}
}
}
三个旁注:我希望此程序在 runFizzBuzz() 函数中执行所有数学运算,以便我可以一起看到它们。其次,我有点像个白痴,所以请告诉我如何将解决方案添加到我的脚本中。最后,我刚刚学会了如何使用 System.in.read() 如果解决方案显而易见,请原谅我!
感谢您对我的帮助!
System.in.read
非常不适合你做的事情。它读取 字节 ,而不是字符,也不是字符所代表的 数字 。数字是你想要的,对吧?
假设您的控制台使用UTF-8,并且您输入“1”然后按回车,那么您已经输入了超过1 个字节!您为字符“1”输入了一个字节,还为换行符输入了一个字节! (请注意,表示换行符的字节数取决于 OS,但从您观察到的行为来看,它最有可能是 1。)
因此这一行读取字符“1”的字节,其数值为 49:
param1a = (char) System.in.read();
然后打印第二个提示,到达这一行:
param1b = (char) System.in.read();
那一行不会停止程序等待你输入,因为还记得你输入了两个字节吗?所以输入流中还有一个字节未读。该行将读取该字节。
然后打印第三个提示,这就是为什么您会看到这样的输出:
Param 1 digit 1 (length)
1
Param 1 digit 2 (length)
Param 1 digit 3 (length)
不仅输出不是你所期望的,param1a
和param1b
也有非常错误的值。
在“字节”级别工作是搬起石头砸自己的脚。我建议使用 Scanner
,它可以通过调用 nextInt
.
来读取整数
public static void main(String[] args) {
int length;
int fizz;
int buzz;
Scanner scanner = new Scanner(System.in);
System.out.println("Param 1 (length)");
length = scanner.nextInt();
System.out.println("Param 2 (fizz)");
fizz = scanner.nextInt();
System.out.println("Param 3 (buzz)");
buzz = scanner.nextInt();
System.out.println("Press e to exe");
if(scanner.next().equals("e")) {
runFizzBuzz(length, fizz, buzz);
}
}
public static void runFizzBuzz(int length, int fizz, int buzz) {
for(int i = 0; i <= length; i++) {
if(i % fizz == 0 && i % buzz == 0) {
System.out.println("FizzBuzz");
} else if (i % fizz == 0) {
System.out.println("Fizz");
} else if (i % buzz == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
你应该为此使用 Scanner
,但如果你不想使用它,你可以使用 InputStreamReader
和 BufferedReader
,但我不推荐它。
public static void main(String[] args)throws IOException {
int length;
int fizz;
int buzz;
InputStreamReader read = new InputStreamReader(System.in);
BufferedReader in = new BufferReader(read);
System.out.println("Param 1 (length)");
length = Integer.parseInt(in.readLine());
System.out.println("Param 2 (fizz)");
fizz = Integer.parseInt(in.readLine());
System.out.println("Param 3 (buzz)");
buzz = Integer.parseInt(in.readLine());
System.out.println("Press e to exe");
if(in.readLine().equals("e")) {
runFizzBuzz(length, fizz, buzz);
}
}
该程序旨在一次接受来自用户的输入 1,以制定 FizzBuzz(计数到 100。计数时,如果数字可以被 3 整除,则说 Fizz。如果它可以被整除5, say Buzz instead. If it is divided by both, say FizzBuzz.) game after complete.第一个输入是长度的第一个数字,第二个输入第二个数字,第三个输入第三个数字。接下来的两个输入将是 Fizz 和第二个 Buzz。但是,在程序中输入第一个字符后,会打印两次?我不明白我的脚本发生了什么。这是我的程序(使用eclipse,如果你需要知道)
public class Game {
public static void runFizzBuzz(int length1, int length2, int length3, int fizz, int buzz) {
String out = ""; //what to print
int foo = length1 * 100 + length2 * 10 + length3; //turns 3 digits into 3 digit num for program to read
for(int i = 0; i <= foo; i++) {
out = ""; //resets out
if(i % fizz == 0) {
out += "Fizz";
}
if(i % buzz == 0) {
out += "Buzz";
}
if(out == "") { //if neither of the above conditions pass, it will just do the number i
out += String.valueOf(i);
}
System.out.println(out); //prints solution
}
}
public static void main(String[] args)
throws java.io.IOException {
//parameters that System.in.read() should change
int param1a; //digit 1 of length
int param1b; //digit 2 of length
int param1c; //digit 3 of length
int param2; //fizz
int param3; //buzz
System.out.println("Param 1 digit 1 (length)");
param1a = (char) System.in.read();
System.out.println("Param 1 digit 2 (length)");
param1b = (char) System.in.read();
System.out.println("Param 1 digit 3 (length)");
param1c = (char) System.in.read();
System.out.println("Param 2 (fizz)");
param2 = (char) System.in.read();
System.out.println("Param 3 (buzz)");
param3 = (char) System.in.read();
System.out.println("Press e to exe"); //when i press e, print fizzbuzz game
if((char) System.in.read() == 'e') {
runFizzBuzz(param1a,param1b,param1c,param2,param3);
}
}
}
三个旁注:我希望此程序在 runFizzBuzz() 函数中执行所有数学运算,以便我可以一起看到它们。其次,我有点像个白痴,所以请告诉我如何将解决方案添加到我的脚本中。最后,我刚刚学会了如何使用 System.in.read() 如果解决方案显而易见,请原谅我!
感谢您对我的帮助!
System.in.read
非常不适合你做的事情。它读取 字节 ,而不是字符,也不是字符所代表的 数字 。数字是你想要的,对吧?
假设您的控制台使用UTF-8,并且您输入“1”然后按回车,那么您已经输入了超过1 个字节!您为字符“1”输入了一个字节,还为换行符输入了一个字节! (请注意,表示换行符的字节数取决于 OS,但从您观察到的行为来看,它最有可能是 1。)
因此这一行读取字符“1”的字节,其数值为 49:
param1a = (char) System.in.read();
然后打印第二个提示,到达这一行:
param1b = (char) System.in.read();
那一行不会停止程序等待你输入,因为还记得你输入了两个字节吗?所以输入流中还有一个字节未读。该行将读取该字节。
然后打印第三个提示,这就是为什么您会看到这样的输出:
Param 1 digit 1 (length)
1
Param 1 digit 2 (length)
Param 1 digit 3 (length)
不仅输出不是你所期望的,param1a
和param1b
也有非常错误的值。
在“字节”级别工作是搬起石头砸自己的脚。我建议使用 Scanner
,它可以通过调用 nextInt
.
public static void main(String[] args) {
int length;
int fizz;
int buzz;
Scanner scanner = new Scanner(System.in);
System.out.println("Param 1 (length)");
length = scanner.nextInt();
System.out.println("Param 2 (fizz)");
fizz = scanner.nextInt();
System.out.println("Param 3 (buzz)");
buzz = scanner.nextInt();
System.out.println("Press e to exe");
if(scanner.next().equals("e")) {
runFizzBuzz(length, fizz, buzz);
}
}
public static void runFizzBuzz(int length, int fizz, int buzz) {
for(int i = 0; i <= length; i++) {
if(i % fizz == 0 && i % buzz == 0) {
System.out.println("FizzBuzz");
} else if (i % fizz == 0) {
System.out.println("Fizz");
} else if (i % buzz == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
你应该为此使用 Scanner
,但如果你不想使用它,你可以使用 InputStreamReader
和 BufferedReader
,但我不推荐它。
public static void main(String[] args)throws IOException {
int length;
int fizz;
int buzz;
InputStreamReader read = new InputStreamReader(System.in);
BufferedReader in = new BufferReader(read);
System.out.println("Param 1 (length)");
length = Integer.parseInt(in.readLine());
System.out.println("Param 2 (fizz)");
fizz = Integer.parseInt(in.readLine());
System.out.println("Param 3 (buzz)");
buzz = Integer.parseInt(in.readLine());
System.out.println("Press e to exe");
if(in.readLine().equals("e")) {
runFizzBuzz(length, fizz, buzz);
}
}