使用fmt.Fscanf函数从输入中读取格式化的数据,并赋值给多个变量,直到遇到换行符

使用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函数读取多个变量等知识。在实际使用中,我们可以根据需要自行组合使用这些知识点,来方便地处理输入数据。

后端开发标签