Java for循环提前终止问题:录入答案密钥的循环未达预期5次迭代
问题原因
你遇到的循环“提前终止”本质是BufferedReader的read()方法会读取输入流中所有字符,包括你输入时按下回车产生的换行符(Windows系统为\r\n两个字符,类Unix系统为\n单个字符)、输入时误打的空格等不可见控制字符,这些字符会被计入循环的读取次数:
比如你输入答案密钥时每输一个字符就按一次回车,那么每输入1个有效答案字符,就会对应1-2个换行控制字符被读入,5次循环实际上很快就被占满,视觉上就表现为你只输入了2-3个字符,循环就结束了。
修复方案
推荐方案:使用readLine()读取输入,过滤无效字符
readLine()会自动忽略末尾的换行符,你只需读取每行的第一个有效字符即可,修改后的核心代码如下:
public class quizscores { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("enter no of participants"); int n=Integer.parseInt(br.readLine()); char arr[][]=new char[n][5]; System.out.println("Please enter answer key"); char ans[]=new char[5]; for(int i=0;i<5;i++) { // 读取整行,去除首尾空白后取第一个字符 String line = br.readLine().trim(); ans[i] = line.charAt(0); } System.out.println("please enter answers of participants "); for(int i=0;i<n;i++) { for(int j=0;j<5;j++) { String line = br.readLine().trim(); arr[i][j] = line.charAt(0); } } } }
备选方案:保留read(),每次读取后清空空白字符
如果你坚持使用read(),可以在每次读取到有效字符后,循环清空输入缓冲区中剩余的空白控制字符:
for(int i=0;i<5;i++) { char c; // 跳过所有空白字符,直到读到有效非空白字符 do { c = (char) br.read(); } while(Character.isWhitespace(c)); ans[i] = c; }
内容的提问来源于stack exchange,提问作者Tejasvini Goel
相关产品推荐
相关产品推荐

