使用System.in.read()接收FizzBuzz程序输入时重复打印问题排查
问题根因
System.in.read()为单字节读取方法,控制台输入后按下的回车会生成换行字节(Windows下为\r、\n两个字节),会被后续的read()直接读取,无需等待新输入,因此会出现输入一次后连续触发提示的问题。- 读取到的字符直接赋值给int变量时,实际存储的是字符的ASCII码值,例如输入
'2',变量拿到的值为50而非数值2,会导致后续计数上限计算完全错误。 - 字符串判空使用
==属于不规范写法,极端场景下会出现判断错误。
修复方案
完全保留runFizzBuzz的运算逻辑,仅修改输入处理部分和不规范的字符串比较代码,修改逻辑如下:
- 每次调用
System.in.read()读取目标字符后,新增逻辑清空输入缓冲区的残留换行符,避免被后续读取逻辑误判为输入内容。 - 将读取到的字符减去
'0'的ASCII码值,转换为对应的数值后再赋值给参数变量。 - 将
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
相关产品推荐
相关产品推荐

