package main
import (
"fmt"
"log"
)
func main() {
var num int
n, err := fmt.Scanf("%d", &num)
fmt.Println(n, num)
if err != nil {
log.Fatalln(err)
}
var r1 rune
n, err = fmt.Scanf("%c", &r1)
fmt.Println(n, r1)
if err != nil {
log.Fatalln(err)
}
var r2 rune
n, err = fmt.Scanf("%c", &r2)
fmt.Println(n, r2)
if err != nil {
log.Fatalln(err)
}
}输入(键盘键)是:1 enter a enter
产出如下:
1 1
1 97
1 10
为什么r2的值是\n,而r1的值是a?
在fmt.Scanf的评论中
输入中的
行必须与格式中的换行符匹配。一个例外:动词%c总是扫描输入中的下一个符文,即使它是空格(或制表符等)。或者换行。
似乎%d后面的换行符被吃掉了,而%c后面的换行符却没有被吃掉。%d未匹配后的换行符是否匹配?
另一个例子:https://play.studygolang.com/p/lRgxrUqyBTI,我尝试使用一个缓冲区来替代stdin,但是输出与使用stdin不同。
go版本是go version go1.17.1 windows/amd64
发布于 2021-11-01 11:20:42
换行符是一个字符,它是一个符文的有效输入,而不是一个int,所以当您捕获一个符文时,将读取和存储新行,而其他类型则不会这样做。
如果你在读符文的时候没有捕捉到新的行,如果你再次尝试从stdin读,你就会得到错误“意外的新闻”。
我建议你按照下面的步骤来读符文,这样你总是能捕捉到换行符,而不会得到意想不到的结果
var r1, r2 rune
n, err = fmt.Scanf("%c%c", &r1, &r2)
fmt.Println(n, r1, r2)
if err != nil {
log.Fatalln(err)
}https://stackoverflow.com/questions/69741192
复制相似问题