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 mainimport "fmt"func main() {str := ""fmt.Scan(&str)fmt.Println(str)
}
输入hello ffff
只能扫描到第一个完整的单词,hello
当需要扫描多个用空格分隔的字符串时候,使用循环来读取后续字符串
package mainimport ("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 mainimport ("bufio""fmt""os"
)func main() {scanner := bufio.NewScanner(os.Stdin)isOk := scanner.Scan()fmt.Println(isOk)text := scanner.Text() // 获取stringfmt.Println(text)bytes := scanner.Bytes() // 获取byte切片fmt.Println(bytes)
}
bufio.NewScanner可以按整行读取字符串,同时Text方法返回字符串,Bytes方法返回字节切片