Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go 输入函数scanf,scan,scanln

Go语言中三个输入函数(scanf,scan,scanln)的区别解析

作者:2301_76723322

本文详细介绍了Go语言中三个输入函数Scanf、Scan和Scanln的区别,包括用法、功能和输入终止条件等,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

Go语言中三个输入函数(scanf,scan,scanln)的区别

在 Go 语言中,fmt 包提供了三种输入函数:Scanf、Scan 和 Scanln。这三个函数都是用于从标准输入读取数据并存储到变量中,但是它们在处理输入的方式上有所不同。下面详细解读每个函数的特点和用法。

1. fmt.Scanf

示例代码:

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("请输入一个整数和一个字符串(格式如:123 hello):")
    fmt.Scanf("%d %s", &a, &b) // 根据格式化字符串读取
    fmt.Println("整数:", a)
    fmt.Println("字符串:", b)
}

注意:

如果输入的格式与指定的格式字符串不匹配,可能会导致读取失败或产生意外结果。

2. fmt.Scan

示例代码:

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("请输入一个整数和一个字符串(用空格分隔):")
    fmt.Scan(&a, &b) // 直接读取输入到变量中
    fmt.Println("整数:", a)
    fmt.Println("字符串:", b)
}

注意:

3. fmt.Scanln

示例代码:

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("请输入一个整数和一个字符串(用空格分隔,并按回车结束):")
    fmt.Scanln(&a, &b) // 读取输入到变量中,并检查换行
    fmt.Println("整数:", a)
    fmt.Println("字符串:", b)
}

注意: 如果输入的值数量与传入的变量数量不匹配,或者在读取所有参数后还有多余的输入,则会返回错误。 总结比较

在这里插入图片描述

这三种函数,都会将换行符,一起读取吗?

在 Go 语言中,fmt.Scanf、fmt.Scan 和 fmt.Scanln 这三个函数处理换行符的方式有所不同。让我们详细解释它们对换行符的处理:

1. fmt.Scanf

示例:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(如:123 hello):")
fmt.Scanf("%d %s", &a, &b) // 如果输入 "123\nhello",换行符会被忽略

在这个例子中,输入时如果用户输入 “123\nhello”,换行符会被忽略,因为它只是分隔了两个数据。

2. fmt.Scan

示例:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(用空格分隔):")
fmt.Scan(&a, &b) // 如果输入 "123\nhello",换行符会被忽略

在这个例子中,输入 “123\nhello” 时,Scan 会忽略换行符并继续读取输入,直到读取到字符串 “hello”。

3. fmt.Scanln

示例:

var a int
var b string
fmt.Print("请输入一个整数和一个字符串(用空格分隔,并按回车结束):")
fmt.Scanln(&a, &b) // 如果输入 "123 hello\n",换行符作为结束标志

在这个例子中,输入 “123 hello\n” 时,Scanln 会正常读取到整数和字符串,并认为换行符是输入的结束标志。

总结

换行符是否被读取取决于函数的设计和用法,Scanln 是唯一一个明确要求换行符作为结束标志的函数。

输入中包含换行符:如果换行符符合格式化字符串的要求,它会被视为空白字符而被忽略,否则会被保留在输入流中等待下一次读取。
对上面加粗部分的解释:
为了更好地理解 fmt.Scanf 如何处理输入中的换行符,下面举一个具体的例子来说明这种行为。

例子

package main
import (
    "fmt"
)
func main() {
    var a int
    var b string
    fmt.Print("请输入一个整数和一个字符串(格式:123 hello):")
    fmt.Scanf("%d %s", &a, &b)
    fmt.Println("a:", a)
    fmt.Println("b:", b)
}

示例 1:

a.fmt.Scanf(“%d %s”, &a, &b) 尝试按格式化字符串 %d %s 解析输入数据。
b.%d 匹配到整数部分,读取 123,成功解析并赋值给变量 a。
c.%s 匹配到字符串部分,读取 hello,成功解析并赋值给变量 b。
d.剩余的换行符 \n 被 Scanf 视为分隔符(空白字符)而忽略掉。

结果: 输出:

a: 123
b: hello

示例 2:输入 “123\nhello”

a.fmt.Scanf(“%d %s”, &a, &b) 首先尝试解析 %d,从输入 “123\n” 中读取到整数 123 并赋值给 a。
b.接下来,fmt.Scanf 尝试读取 %s,但此时输入流中的字符是换行符 \n,它不符合字符串的格式要求。因此,Scanf 读取 %s 的尝试失败,换行符 \n 被保留在输入流中等待下一次读取。
c.因为读取 %s 失败,b 没有被赋值,程序继续等待下一个输入。
d.当用户再输入 hello 并按下 Enter 后,Scanf 成功读取到字符串 hello 并赋值给 b。

结果: 输出:

a: 123
b: hello

解释

在示例 1 中,“123 hello\n” 中的换行符被视为空白字符,符合格式化字符串的要求,因此被忽略。而在示例 2 中,“123\nhello” 中的换行符不符合 %s 的格式要求,导致 Scanf 读取失败,换行符保留在输入流中,等待下一次读取。
这展示了 fmt.Scanf 处理换行符的两种情况:符合格式时忽略,不符合时保留在输入流中。

到此这篇关于Go语言中三个输入函数(scanf,scan,scanln)的区别的文章就介绍到这了,更多相关Go 输入函数scanf,scan,scanln内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文