我如何一次接受来自 System.in.read() 的输入?我究竟做错了什么?

How do I one at a time, accept inputs from System.in.read()? What am I doing wrong?

该程序旨在一次接受来自用户的输入 1,以制定 FizzBu​​zz(计数到 100。计数时,如果数字可以被 3 整除,则说 Fizz。如果它可以被整除5, say Buzz instead. If it is divided by both, say FizzBu​​zz.) 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);
    }
}
}

三个旁注:我希望此程序在 runFizzBu​​zz() 函数中执行所有数学运算,以便我可以一起看到它们。其次,我有点像个白痴,所以请告诉我如何将解决方案添加到我的脚本中。最后,我刚刚学会了如何使用 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)

不仅输出不是你所期望的,param1aparam1b也有非常错误的值。


在“字节”级别工作是搬起石头砸自己的脚。我建议使用 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,但如果你不想使用它,你可以使用 InputStreamReaderBufferedReader,但我不推荐它。

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);
  }
}