【问题标题】:How can you solve an input in the same line problen in Kotlin?在 Kotlin 中如何解决同一行问题中的输入?
【发布时间】:2021-11-28 19:44:58
【问题描述】:

我在 Kotlin 中的控制台应用程序有问题。该程序在同一行中读取两个变量。如果我没记错的话,这只能用 readLine()!!.split(" ") 来完成,问题是下一个。它需要2个输入。当仅提供一个输入时,由于未输入第二个变量,程序会因越界而崩溃。在任务中,程序必须以输入 /exit 退出。我不知道该怎么做。为第二个输入输入空格不是一个选项,因为测试不接受它。提前致谢。

按格式输入两个数字:{source base} {target base}(退出输入 /exit)> 36 10 输入以 36 为底的数字以转换为以 10 为底的数字(要返回输入/返回)> abcde 转换结果:17325410

按格式输入两个数字:{source base} {target base}(退出输入 /exit)> /exit

【问题讨论】:

  • 据我了解,split() 不会崩溃,当您访问结果[1] 时会崩溃。为什么不检查 result[0] 是否为 '/exit',如果是,甚至不访问 result[1]?
  • 如何验证您的输入,例如split 的结果是否确实有两个元素?
  • 按格式输入两个数字: {source base} {target base} (退出输入/exit) > /exit 然后程序退出。当输入 2 个输入时,程序继续如下: 输入两个数字,格式为:{source base} {target base}(退出类型 /exit)> 36 10 输入 base 36 中的数字以转换为 base 10(返回类型/back) > abcde 转换结果:17325410

标签: kotlin input


【解决方案1】:

我不会回答你所说的整个问题,而只是解决你的OutOfBoundException,因为在我看来它就像一个homework question


如果您不介意为 /exit 以外的输入抛出 OutOfBoundException,以下可能对您有用。

val line = readln().trim()

if (line == "/exit") {
    // exit, e.g. through System.exit(0) or other means
} else {
    val bases = line
        .split(" ")
        .map { it.toInt() }
    val (sourceBase, targetBase) = bases

    // carry on with your program ...
}

在拆分输入并将其转换为数字之前,您可能希望明确验证 /exit 以外的输入。

在这个简单的例子中,您可以使用正则表达式来验证用户输入。以下内容可能对您有用。

require(line.matches("""^\d+ \d+$""".toRegex())) {
    "You must enter two integer numbers delimited by a single space character!"
}

如果你还没有接触过正则表达式(regex),我会为你拆开上面的内容:

  • ^ - 从行首开始验证
  • \d - 匹配任何数字
    • + - 匹配前一个令牌(任何数字)一次到无限次,尽可能多次
  • - 从字面上匹配空白字符
  • \d - 匹配任何数字
    • + - 匹配前一个令牌(任何数字)一次到无限次,尽可能多次
  • $ - 验证到行尾

我有意识地省略了任何控制流结构,因为这些结构与 OutOfBoundException 无关。

【讨论】:

  • 我不把它称为家庭作业,它是 Hyperskill 中的一个项目。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-06-13
  • 2020-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多