php中文网

Go 语言中 Scanln 函数为何会忽略一些输入?

php中文网

go 语言的 scanln 为什么忽略了一些输入?

在 go 语言中,scan 和 scanln 函数用于从输入流(通常是标准输入)中读取数据。据官方文档所述,scanln 函数的行为与 scan 函数相似,但会在遇到换行符时停止扫描。然而,在实际使用中,我们发现 scanln 函数有时会忽略一些输入。

让我们来看一个示例。以下代码使用 scan 函数逐个读取输入的整数:

package main

import "fmt"

func main() {
    for {
        var x int
        n, _ := fmt.scan(&x)
        fmt.println("n:", n, "x:", x)
        if n == 0 {
            break
        }
    }
}

输入以下数据:

123 456 789

运行该程序后,控制台将打印:

n: 1 x: 123
n: 1 x: 456
n: 1 x: 789

接下来,我们修改代码,使用 scanln 函数代替 scan 函数:

package main

import "fmt"

func main() {
    for {
        var x int
        n, _ := fmt.scanln(&x)
        fmt.println("n:", n, "x:", x)
        if n == 0 {
            break
        }
    }
}

相同的输入数据再次输入。这次,控制台打印:

n: 1 x: 123
n: 1 x: 56
n: 1 x: 89

正如你所见,当使用 scanln 函数时,程序意外地忽略了输入的最后一个字符。

原因在于,scanln 函数不仅在遇到换行符时停止扫描,它还会在最后一个元素后检查是否还有额外的字符。如果存在额外的字符,scanln 函数会报错。为了避免这个问题,在使用 scanln 函数时,需要确保最后一个输入元素后面有换行符或 eof(文件末尾)。

简而言之,当使用 scanln 函数读取输入时,如果最后一个输入元素后没有换行符或 eof,程序可能会忽略一些输入字符。对于简单的输入,建议使用 scan 函数来避免这种情况。

以上就是Go 语言中 Scanln 函数为何会忽略一些输入?的详细内容,更多请关注php中文网其它相关文章!