首页 > 解决方案 > 扫描仪无法正确读取行

问题描述

我的代码很简单,如下所示:

    val rows = scanner.nextInt()
    val numbersInRow = scanner.nextLine().split(" ")

当我尝试写“5”然后按回车然后写“1 2 3 4 5”我的变量 numbersInRow 存储:

1 - ""
2 - "2"
3 - "3"
4 - "4"
5 - "5"

而且我无法弄清楚为什么列表(1)中的第一个元素存储空字符。

标签: kotlin

解决方案


永远不要打电话nextLine。相反,调用(在创建扫描仪后立即调用),scanner.useDelimiter("\\R");然后调用.next()读取整行。

这将做你想要的。

(说明:next()返回到下一个 'token',默认情况下是任何空格,但实际上并不消耗它;相反,另一个nextX()调用会消耗它。.nextLine读取到下一行。这意味着如果你调用 next 方法,然后一个 nextLine 方法,假设用户使用回车键分隔输入,该nextLine()方法返回一个空白字符串。这不是你想要的,但真正的问题是“任何空白”的默认分隔符不是你想要的想要。你想要“换行符”作为分隔符。\\R是“换行符”。这是更简单的代码,更少的代码,如果用户决定使用键盘上最大的键(与注入nextLine()调用'吃掉空格'如果他们这样做会失败)。


请注意,评论中的链接答案给出了较差的建议。我不确定如何处理之前已经提出问题的概念,对所述问题的主要(和已接受)答案并不正确,但明显逊色,但任何其他答案都没有滚雪球的机会。


推荐阅读