fmt.Scan系列
fmt.Scan函数定义如下:
// Scan scans text read from standard input, storing successive space-separated values into successive arguments.
// Newlines count as space.
// It returns the number of items successfully scanned.
// If that is less than the number of arguments, err will report why.
func Scan(a ...any) (n int, err error) {
return Fscan(os.Stdin, a...)
}
使用fmt.Scan扫描到空格的时候,就会结束扫描。在acm类比赛中,输入时数据可能按空格拆分,所以读取完整的数据十分不便,需要借助循环才能达到目的。
package main
import "fmt"
func main() {
str := ""
fmt.Scan(&str)
fmt.Println(str)
}
输入hello ffff
只能扫描到第一个完整的单词,hello
当需要扫描多个用空格分隔的字符串时候,使用循环来读取后续字符串
package main
import (
"fmt"
)
func main() {
str := ""
for {
n, err := fmt.Scan(&str)
fmt.Println(n, err, str)
if err != nil {
break
}
}
}
按ctrl + c组合键可终结输入,可以看到,当读入ctrl+c终结符的时候,err 保存了EOF(文件尾标志)。hi与hey之间有多个空白字符,按一个处理。
bufio.NewScanner(os.Stdin)系列
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
isOk := scanner.Scan()
fmt.Println(isOk)
text := scanner.Text() // 获取string
fmt.Println(text)
bytes := scanner.Bytes() // 获取byte切片
fmt.Println(bytes)
}
bufio.NewScanner可以按整行读取字符串,同时Text方法返回字符串,Bytes方法返回字节切片