使用fmt.Fscanf函数读取格式化数据
在Go语言中,我们可以使用fmt包中的Fscanf函数从输入中读取格式化的数据。这个函数的声明如下:
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
其中,第一个参数r是实现了io.Reader接口的对象,第二个参数format是要匹配的格式化字符串,后面的参数a是需要赋值的变量。
这个函数会根据格式化字符串中的占位符,从输入中读取相应类型的数据,然后赋值给相应的变量。当读取完所有变量后,函数将返回读取的变量数目和可能发生的错误。
从输入中读取多个变量
指定变量类型和占位符
在使用Fscanf函数时,我们需要指定要赋值的变量的类型和对应的占位符。下面是一些常用的指定变量类型和占位符的方式:
string类型使用%s占位符
整数类型使用%d占位符
浮点数类型使用%f或%e或%E占位符
除此之外,我们还可以使用一些特殊的占位符,如%v和%T:
%v会自动匹配相应变量的类型和值
%T会输出变量的类型信息
下面是一个简单的例子,展示如何使用Fscanf函数读取多个变量:
package main
import (
"fmt"
"os"
)
func main() {
var name string
var age int
fmt.Print("请输入姓名和年龄,以空格分隔:")
fmt.Fscanf(os.Stdin, "%s %d", &name, &age)
fmt.Printf("姓名:%s,年龄:%d\n", name, age)
}
在上面这个例子中,我们从标准输入中读取了一个字符串和一个整数,然后分别赋值给了变量name和age。在Fscanf函数中,我们使用了%s和%d占位符来指定相应变量的类型,&name和&age表示变量的地址,以便Fscanf函数可以将读取到的值存储到变量中。
读取输入直到换行符
如果我们想一次性从输入中读取多个变量,直到遇到换行符为止,该怎么办呢?在这种情况下,我们可以在格式化字符串中使用%c占位符,表示读取一个字符。
package main
import (
"fmt"
"os"
)
func main() {
var name string
var age int
var gender rune
fmt.Print("请输入姓名、年龄和性别,以空格分隔:")
fmt.Fscanf(os.Stdin, "%s %d", &name, &age)
fmt.Fscanf(os.Stdin, "%c", &gender)
fmt.Printf("姓名:%s,年龄:%d,性别:%c\n", name, age, gender)
}
在上面的例子中,我们首先使用Fscanf函数分别读取了两个变量name和age,然后使用Fscanf函数读取一个字符,存储到变量gender中。由于%c占位符可以读取任何字符,所以它可以在读取到换行符后结束读取。
结合循环读取多个变量
有时候我们可能需要从输入中读取多个变量,但是这些变量的数量是不确定的,我们该怎么办呢?这时候我们可以使用循环结合Fscanf函数来读取变量。
读取一行变量
package main
import (
"fmt"
"os"
)
func main() {
var s1, s2 string
var i1, i2 int
var f1 float32
for {
n, err := fmt.Fscanf(os.Stdin, "%s %d %s %d %f\n", &s1, &i1, &s2, &i2, &f1)
if err != nil {
fmt.Println(err)
break
}
fmt.Printf("读取到 %d 个变量\n", n)
fmt.Printf("s1=%s, i1=%d, s2=%s, i2=%d, f1=%f\n", s1, i1, s2, i2, f1)
}
}
在上面这个例子中,我们首先定义了5个变量s1、i1、s2、i2和f1。然后我们使用for循环不断地从标准输入中读取变量,直到读到结束符(这里是换行符)。Fscanf函数的格式化字符串中包含了5个占位符,它们分别对应上面定义的5个变量。循环中的代码会在每次读取到变量时输出变量的值,并计算读取到的变量数目。当读取到结束符时,循环结束。
读取多行变量
package main
import (
"fmt"
"os"
)
func main() {
var name string
var age int
var ok bool
for {
n, err := fmt.Fscanf(os.Stdin, "%s %d %t\n", &name, &age, &ok)
if err != nil {
fmt.Println(err)
break
}
fmt.Printf("读取到 %d 个变量\n", n)
fmt.Printf("姓名:%s,年龄:%d,是否合法:%t\n", name, age, ok)
}
}
在上面的例子中,我们首先定义了3个变量name、age和ok。然后我们使用for循环不断地从标准输入中读取变量,直到读到结束符(这里是换行符)。Fscanf函数的格式化字符串中包含了3个占位符,它们分别对应上面定义的3个变量。循环中的代码会在每次读取到变量时输出变量的值,并计算读取到的变量数目。当读取到结束符时,循环结束。
总结
本文介绍了如何使用fmt.Fscanf函数从输入中读取格式化的数据,并赋值给多个变量,直到遇到换行符。我们还学习了如何使用不同的占位符指定变量的类型、循环结合Fscanf函数读取多个变量等知识。在实际使用中,我们可以根据需要自行组合使用这些知识点,来方便地处理输入数据。