Java中nextLine方法无法读入字符串的问题
时间:2021/03/05
一.问题描述#
今天在做OJ题时遇到使用nextLine方法读取一整行输入时为空字符串的情况,具体代码如下:
Scanner in = new Scanner(System.in); HashMap<String, String> map = new HashMap<>(); int n = in.nextInt(); for(int i = 0; i < n; i++){ String str = in.nextLine(); String[] s = str.split(" "); map.put(s[0], str); }
按照提议是先读取一个数字N表示输入学生信息的个数,之后再读取学生信息。
但是经过调试发现读取的第一个str为空字符串,之后能够正常读取字符串。
二.问题原因#
经过从网上查询资料,了解到Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格、回车等都算作是空白符。
上面代码中的nextInt方法在扫描到有效字符后会将回车符留在缓冲区中,这就导致下面for循环中nextLine读的第一个数据就是换行符,所以读入的是空字符串。
next()与nextLine()的区别
- next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其过滤掉;只有在读取到有效字符之后,next()方法才将其后的空格键、Tab键或Enter键等视为结束符;所以next()方法不能得到带空格的字符串。
- nextLine()方法字面上有扫描一整行的意思,它的结束符只能是Enter键,即nextLine()方法返回的是Enter键之前没有被读取的所有字符,它是可以得到带空格的字符串的。
- next()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中
- nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉
三.问题解决#
在nextInt方法下面加一个nextLine方法用来清理空白符。
修改后的代码如下:
Scanner in = new Scanner(System.in); HashMap<String, String> map = new HashMap<>(); int n = in.nextInt(); String empty = in.nextLine(); //清理nextInt方法留下的空白符 for(int i = 0; i < n; i++){ String str = in.nextLine(); String[] s = str.split(" "); map.put(s[0], str); }
作者:machi
出处:https://www.cnblogs.com/machi12/p/14486411.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
努力,向上,自律
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!