在Kotlin中读取控制台输入

siu*_*iur 35 console stdin input kotlin

我试图接受来自Kotlin控制台的输入但很难,因为我对语法不太确定.

我从主要开始

fun main(args: Array<String>) {

}
Run Code Online (Sandbox Code Playgroud)

在此之后我应该输入什么?我知道println()并且readline()参与其中但我不知道如何构建它们.

目标:提示用户输入一个数字,输入的数字乘以6,程序将结果返回到控制台显示.

Vad*_*zim 68

以下是来自stdin的Kotlin中的A + B示例:

fun main() {
  val (a, b) = readLine()!!.split(' ')
  println(a.toInt() + b.toInt())
}
Run Code Online (Sandbox Code Playgroud)

要么

fun main(vararg args: String) {
  val (a, b) = readLine()!!.split(' ').map(String::toInt)
  println(a + b)
}
Run Code Online (Sandbox Code Playgroud)

要么

fun readInts() = readLine()!!.split(' ').map { it.toInt() }

fun main(vararg args: String) {
  val (a, b) = readInts()
  println(a + b)
}
Run Code Online (Sandbox Code Playgroud)

要么

import java.util.Scanner

fun main() {
  val input = Scanner(System.`in`)
  val a = input.nextInt()
  val b = input.nextInt()
  println(a + b)
}
Run Code Online (Sandbox Code Playgroud)

要么

with(Scanner(System.`in`)) {
    val a = nextInt()
    val b = nextInt()
    println(a + b)
}
Run Code Online (Sandbox Code Playgroud)

要注意的是扫描仪有点慢.这在某些情况下可能很重要,比如竞争性编程,只需用普通的readLine替换Scanner,程序在大输入上的执行速度可以提高两倍.

希望有一天在Kotlin stdlib中引入一个简洁,跨平台,高性能,通用的控制台和文件输入解析支持.喜欢readString(),readLine()等等全局和readInt扩展功能.


奖金

有时你从控制台输入/输出开始,但然后需要切换到文件.使用文件流变量预先添加每个读取或写入调用变得太繁​​琐.

这是Kotlin魔法的和平,允许用几行来包装未改变的控制台代码,以强制它读取和写入文件,同时确保它们正确关闭:

private fun readln() = readLine()!!
private fun readlnByte() = readln().toByte()
private fun readlnShort() = readln().toShort()
private fun readlnInt() = readln().toInt()
private fun readlnLong() = readln().toLong()
private fun readlnFloat() = readln().toFloat()
private fun readlnDouble() = readln().toDouble()
private fun readlnBigInt(radix: Int = 10) = readln().toBigInteger(radix)
private fun readlnBigDecimal() = readln().toBigDecimal()

private fun lineSequence(limit: Int = Int.MAX_VALUE) = generateSequence { readLine() }.constrainOnce().take(limit)
private fun readlnStrings() = readln().split(' ')
private fun readlnBytes() = readlnStrings().map { it.toByte() }
private fun readlnShorts() = readlnStrings().map { it.toShort() }
private fun readlnInts() = readlnStrings().map { it.toInt() }
private fun readlnLongs() = readlnStrings().map { it.toLong() }
private fun readlnFloats() = readlnStrings().map { it.toFloat() }
private fun readlnDoubles() = readlnStrings().map { it.toDouble() }

private fun readByteArray() = readlnStrings().run { ByteArray(size) { get(it).toByte() } }
private fun readShortArray() = readlnStrings().run { ShortArray(size) { get(it).toShort() } }
private fun readIntArray() = readlnStrings().run { IntArray(size) { get(it).toInt() } }
private fun readLongArray() = readlnStrings().run { LongArray(size) { get(it).toLong() } }
private fun readFloatArray() = readlnStrings().run { FloatArray(size) { get(it).toFloat() } }
private fun readDoubleArray() = readlnStrings().run { DoubleArray(size) { get(it).toDouble() } }

private fun readlnByteArray(n: Int) = ByteArray(n) { readlnByte() }
private fun readlnShortArray(n: Int) = ShortArray(n) { readlnShort() }
private fun readlnIntArray(n: Int) = IntArray(n) { readlnInt() }
private fun readlnLongArray(n: Int) = LongArray(n) { readlnLong() }
private fun readlnFloatArray(n: Int) = FloatArray(n) { readlnFloat() }
private fun readlnDoubleArray(n: Int) = DoubleArray(n) { readlnDouble() }

private fun readByteArray2d(rows: Int, cols: Int) = Array(rows) { readByteArray().also { require(it.size == cols) } }
private fun readShortArray2d(rows: Int, cols: Int) = Array(rows) { readShortArray().also { require(it.size == cols) } }
private fun readLongArray2d(rows: Int, cols: Int) = Array(rows) { readLongArray().also { require(it.size == cols) } }
private fun readIntArray2d(rows: Int, cols: Int) = Array(rows) { readIntArray().also { require(it.size == cols) } }
private fun readFloatArray2d(rows: Int, cols: Int) = Array(rows) { readFloatArray().also { require(it.size == cols) } }
private fun readDoubleArray2d(rows: Int, cols: Int) = Array(rows) { readDoubleArray().also { require(it.size == cols) } }

private fun isWhiteSpace(c: Char) = c in " \r\n\t"

// JVM-only targeting code follows next

// readString() via sequence is still slightly faster than Scanner
private fun readString() = generateSequence { System.`in`.read().toChar() }
        .dropWhile { isWhiteSpace(it) }.takeWhile { !isWhiteSpace(it) }.joinToString("")
private fun readByte() = readString().toByte()
private fun readShort() = readString().toShort()
private fun readInt() = readString().toInt()
private fun readLong() = readString().toLong()
private fun readFloat() = readString().toFloat()
private fun readDouble() = readString().toDouble()
private fun readBigInt(radix: Int = 10) = readString().toBigInteger(radix)
private fun readBigDecimal() = readString().toBigDecimal()

private fun readBytes(n: Int) = generateSequence { readByte() }.take(n)
private fun readShorts(n: Int) = generateSequence { readShort() }.take(n)
private fun readInts(n: Int) = generateSequence { readInt() }.take(n)
private fun readLongs(n: Int) = generateSequence { readLong() }.take(n)
private fun readFloats(n: Int) = generateSequence { readFloat() }.take(n)
private fun readDoubles(n: Int) = generateSequence { readDouble() }.take(n)
Run Code Online (Sandbox Code Playgroud)

当需要切换回控制台时,可以快速注释掉包装线.

  • @SimpleFellow,我使用这个稍微微弱的问题来分享几个简单的方法,为更广泛的受众提供额外的知识福利,而不仅仅是一个提问者.我认为这就是SO的全部意义所在.到目前为止,我在这里看到了许多流行的非常详细的答案,但是通过downvote对质量的压缩是一种新奇.)随意提供更简单的答案,或更好的答案,或两者兼而有之.) (2认同)

小智 7

使用 readLine() 从用户获取输入,ATQ:

fun main(args:Array<String>){
    print("Enter a number")
    var variableName:Int = readLine()!!.toInt()  // readLine() is used to accept the String value and ".toInt()" will convert the string to  Int. 
    var result:Int= variableName*6
    print("The output is:$result") 
}
Run Code Online (Sandbox Code Playgroud)


SHo*_*oko 6

有多种选择可以使用 Kotlin 处理控制台 I/O。

\n\n

1. 使用 Kotlin 标准库:Kotlin 标准库为我们提供了基于 JDK 类处理 I/O 的扩展。

\n\n

要在控制台中打印,我们可以使用该print函数。如果我们运行以下代码片段:

\n\n
print("Hello from Kotlin")\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们\xe2\x80\x99将在终端上看到以下消息:

\n\n
print("Hello from Kotlin")\n
Run Code Online (Sandbox Code Playgroud)\n\n

该函数在幕后使用 JavaSystem.out.print方法。此外,该库为我们提供了println替代功能,即在消息末尾添加行分隔符。

\n\n

为了从控制台读取数据,我们可以使用readLine函数:

\n\n
val inputText = readLine()\n
Run Code Online (Sandbox Code Playgroud)\n\n

2. 使用 Java 标准库:Kotlin 与 Java 具有很强的互操作性。因此,我们可以在程序中使用 JDK 中的标准 I/O 类,以备不时之需。

\n\n

2.1. 使用 Scanner 类:使用该类Scanner非常简单;我们只需要创建一个实例并使用该nextLine方法:

\n\n
val scanner = Scanner(System.`in`)\n\nval readText = scanner.nextLine()\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我们使用反引号转义 in 属性,因为它\xe2\x80\x99 是 Kotlin 中的关键字。

\n\n

2.2. 使用 BufferedReader 类:要使用该类BufferedReader从标准输入流读取,我们首先需要实例化System.in

\n\n
val reader = BufferedReader(InputStreamReader(System.`in`))\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我们可以使用它的方法 \xe2\x80\x94 例如readLine()

\n\n
val readText = reader.readLine()\n
Run Code Online (Sandbox Code Playgroud)\n\n

2.3. 使用 Console 类:与前两个类不同,该类Console具有处理控制台 I/O 的附加方法,例如readPasswordprintf

\n\n

为了使用该类,Console我们需要从该类获取实例System

\n\n
val console = System.console()\n\nval readText = console.readLine()\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,由于 Kotlin\xe2\x80\x99s 与 Java 的互操作性,我们可以使用其他 Java 库来处理 I/O。

\n\n

在您的情况下,读取输入后,您可以使用该函数转换该String值。InttoInt()

\n