GO语⾔学习笔记1-输⼊带空格的字符串
⽬录
最近开始学习GO语⾔,并做了⼀些编程练习。有道题要输⼊带空格的字符串,这在C/C++中很容易实现,但GO中好像并不那么容易。学过C/C++的可能都知道,在C中可以使⽤gets()函数,在C++可以使⽤getline()函数来实现输⼊带空格的字符串。那我们可能要问在GO中有没有类似的函数?答案是否定的。
在GO中除了fmt和os包,我们还可以使⽤bufio来实现带缓存输⼊和输出。
我们要怎样读取⽤户从键盘(控制台)输⼊的数据?输⼊是指从键盘或其它标准输⼊(os.Stdin)读取数据。
使⽤fmt包里的Scan_或Sscan_系列函数输⼊
package main
import "fmt"
var (
firstName, lastName string
str1, str2, str3 string
num int
str = "We / love / Go / 1314"
format = "%s / %s / %s / %d"
)
func main() {
fmt.Println("Please input your full name: ")
// 使⽤Scan输⼊
fmt.Scan(&firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName)
fmt.Println("Please again input your full name: ")
// 使⽤Scanln输⼊
fmt.Scanln(&firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName)
fmt.Println("Please again input your full name: ")
// 使⽤Scanf输⼊
fmt.Scanf("%s %s", &firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName)
fmt.Println("From the str we read: ")
// 使⽤Sscanf读取
fmt.Sscanf(str, format, &str1, &str2, &str3, &num)
fmt.Println(str1, str2, str3, num)
}
若输⼊为:空格字符串是什么
xiao hua
xiao ming
xiao hong
则输出为:
Please input your full name:
xiao hua
Hi xiao hua!
Please again input your full name:
xiao ming
Hi xiao ming!
Please again input your full name:
xiao hong
Hi xiao hong!
From the str we read:
We love Go 1314
Scan()函数原型为:
func Scan(a ...interface{}) (n int, err error) {
return Fscan(os.Stdin, a...)
}
Scan从标准输⼊扫描⽂本,将成功读取的空⽩分隔的值保存进成功传递给本函数的参数。换⾏视为空⽩。返回成功扫描的条⽬个数和遇到的任何错误。如果读取的条⽬⽐提供的参数少,会返回⼀个错误报告原因。
Scanln()函数原型为:
func Scanln(a ...interface{}) (n int, err error) {
return Fscanln(os.Stdin, a...)
}
Scanln类似于Scan,但会在换⾏符处停⽌扫描,在最后⼀个条⽬后必须有换⾏符或EOF。
Scanf()函数原型为:
func Scanf(format string, a ...interface{}) (n int, err error) {
return Fscanf(os.Stdin, format, a...)
}
Scanf从标准输⼊扫描⽂本,根据format参数指定的格式将成功读取的空⽩分隔的值保存进成功传递给本函数的参数。返回成功扫描的条⽬个数和遇到的任何错误。
输⼊中的换⾏符必须与格式中的换⾏符匹配。
Sscanf()函数原型为:
func Sscanf(str string, format string, a ...interface{}) (n int, err error) {
return Fscanf((*stringReader)(&str), format, a...)
}
Sscanf从字符串str扫描⽂本,根据format参数指定的格式将成功读取的空⽩分隔的值保存进成功传递给本函数的参数。返回成功扫描的条⽬个数和遇到的任何错误。
输⼊中的换⾏符必须与格式中的换⾏符匹配。
Scan与Scanln⽅法的区别:
Scan函数会识别空格左右的内容,哪怕换⾏符存在也不会影响Scan对内容的获取。
Scanln函数会识别空格左右的内容,但是⼀旦遇到换⾏符就会⽴即结束,不论后续还是否存在需要输⼊的内容。
使⽤bufio包里带缓冲的Reader实现带空格字符串的输⼊
package main
import (
"bufio"
"fmt"
"os"
)
//var inputReader *bufio.Reader
//var input string
//var err error
func main() {
inputReader := bufio.NewReader(os.Stdin) // 使⽤了⾃动类型推导,不需要var关键字声明
//inputReader = bufio.NewReader(os.Stdin)
fmt.Println("Please input your name: ")
//input, err = inputReader.ReadString('\n')
input, err := inputReader.ReadString('\n')
if err == nil {
fmt.Printf("Your name is: %s\n", input)
}
}
若输⼊为:
xiao hua
则输出为:
Please input your name:
xiao hua
Your name is: xiao hua
上例中,inputReader是个指针,它指向⼀个bufio类的Reader,然后在main函数里,通过bufio.NewReader(os.Stdin)
创建了⼀个buffer Reader,并联接到inputReader这个变量。
bufio.NewReader()函数原型为:
func NewReader(rd io.Reader) *Reader {
return NewReaderSize(rd, defaultBufSize)
}
任何符合io.Reader接⼝的对象法都可以作为bufio.NewReader()里的参数,并返回⼀个新的带缓冲的io.Reader,os.Stdin符合这个条件。这个带缓冲的Reader有⼀个⽅法ReadString(delim byte), 这个⽅法会⼀直读数据,直到遇到了指定的终⽌符(delim byte)才结束输⼊,终⽌符将成为输⼊的⼀部分,⼀起放到buffer里。
RearString()函数原型为:
func (b *Reader) ReadString(delim byte) (string, error) {
bytes, err := b.ReadBytes(delim)
return string(bytes), err
}
ReadString返回值是读到的字符串及nil。如果在读到结束时没有发现指定的结束符(delim byte),将返回⼀个 err != nil。在上⾯的例⼦中,我们从键盘输⼊直到键⼊“\n”才结束。屏幕是标准输出os.Stdout,错误信息被写到os.Stderr。⼤多情况下,os.Stderr等同os.Stdout。
⼀般情况下,在GO的代码里省略了变量声明,⽽直接使⽤”:=“进⾏⾃动类型推导,如:
inputReader := bufio.NewReader(os.Stdin)
input, err := inputReader.ReadString('\n')
总结
GO中Scan_或Sscan_系列函数与C中的scan_系统函数的⽤法相似,学过C的⼈可以很快学会这些函数的使⽤。但要实现带空格字符串的输⼊,则要使⽤bufio包里带缓冲的Reader和os包⾥的os.Stdin。
个⼈主页:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论