Java统计多行元音程序循环最后一次迭代需按回车才输出问题求助
问题原因
这是Scanner.nextLine()方法的固有特性导致的:该方法必须读取到换行符才会判定当前行结束,返回读取到的行内容(自动丢弃末尾的换行符)。
当你手动输入测试数据时,输入完最后一行I like the sun后如果没有按下回车键,第6次循环执行的a = in.nextLine()会一直处于阻塞等待状态,不会执行后续的统计、打印逻辑,所以只能看到前5行的统计结果。只有按下回车键输入换行符后,最后一行的读取流程才会完成,第6个统计值才会打印输出。
如果是从带完整换行的文件重定向输入,这个问题不会出现,因为规范的文本文件最后一行末尾都会自带换行符。
另外你的代码还有一个隐藏问题:当前只判断了小写的元音字母,输入里的大写元音(比如第一行的Emily首字母E)会被漏统计。
解决方法
临时解决方案(交互式输入场景)
输入完所有内容后,额外按下一次回车键补全最后一行的末尾换行即可,原有代码无需修改。
兼容无末尾换行的输入场景
可以调整读取逻辑,优先判断是否还有剩余输入,同时增加大写元音的判断逻辑,修改后的代码如下:
Scanner in = new Scanner(System.in); int cases = in.nextInt(); in.nextLine(); // 跳过nextInt()剩余的换行符 for (int i = 0; i < cases; i++) { // 优先判断是否还有可读取的行,避免无换行时的永久阻塞 if (!in.hasNextLine()) { break; } String a = in.nextLine(); int vowels = 0; for (int b = 0; b < a.length(); b++) { char temp = Character.toLowerCase(a.charAt(b)); if (temp == 'a' || temp == 'e' || temp == 'i' || temp == 'o' || temp == 'u') { vowels++; } } System.out.println(vowels); }
修改点说明:
- 用
Character.toLowerCase()统一转小写后再判断,避免漏统计大写元音 - 增加
in.hasNextLine()判断,当输入没有剩余内容时直接跳出循环,避免永久阻塞 - 调整了变量的作用域,把
vowels变量移到循环内定义,无需每次手动重置为0,代码更简洁
内容的提问来源于stack exchange,提问作者Maniram
相关产品推荐
相关产品推荐

