You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用System.in.read()接收FizzBuzz程序输入时重复打印问题排查

问题根因
  • System.in.read()为单字节读取方法,控制台输入后按下的回车会生成换行字节(Windows下为\r、\n两个字节),会被后续的read()直接读取,无需等待新输入,因此会出现输入一次后连续触发提示的问题。
  • 读取到的字符直接赋值给int变量时,实际存储的是字符的ASCII码值,例如输入'2',变量拿到的值为50而非数值2,会导致后续计数上限计算完全错误。
  • 字符串判空使用==属于不规范写法,极端场景下会出现判断错误。
修复方案

完全保留runFizzBuzz的运算逻辑,仅修改输入处理部分和不规范的字符串比较代码,修改逻辑如下:

  1. 每次调用System.in.read()读取目标字符后,新增逻辑清空输入缓冲区的残留换行符,避免被后续读取逻辑误判为输入内容。
  2. 将读取到的字符减去'0'的ASCII码值,转换为对应的数值后再赋值给参数变量。
  3. 将runFizzBuzz中的字符串判空逻辑改为调用equals()方法。

完整修改后代码

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.equals("")) { //修改字符串比较方式
                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();
        param1a -= '0'; //字符转对应数值
        while (System.in.available() > 0) System.in.read(); //清空缓冲区残留换行
        
        System.out.println("Param 1 digit 2 (length)");
        param1b = (char) System.in.read();
        param1b -= '0';
        while (System.in.available() > 0) System.in.read();
        
        System.out.println("Param 1 digit 3 (length)");
        param1c = (char) System.in.read();
        param1c -= '0';
        while (System.in.available() > 0) System.in.read();
        
        System.out.println("Param 2 (fizz)");
        param2 = (char) System.in.read();
        param2 -= '0';
        while (System.in.available() > 0) System.in.read();
        
        System.out.println("Param 3 (buzz)");
        param3 = (char) System.in.read();
        param3 -= '0';
        while (System.in.available() > 0) 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);
        }
    }
}

内容的提问来源于stack exchange,提问作者CiY3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 07:00:04