首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要吃掉%d之后的换行符,而不是fmt.Scanf中的%c呢?

为什么要吃掉%d之后的换行符,而不是fmt.Scanf中的%c呢?
EN

Stack Overflow用户
提问于 2021-10-27 15:11:46
回答 1查看 112关注 0票数 3
代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2021-11-01 11:20:42

换行符是一个字符,它是一个符文的有效输入,而不是一个int,所以当您捕获一个符文时,将读取和存储新行,而其他类型则不会这样做。

如果你在读符文的时候没有捕捉到新的行,如果你再次尝试从stdin读,你就会得到错误“意外的新闻”。

我建议你按照下面的步骤来读符文,这样你总是能捕捉到换行符,而不会得到意想不到的结果

代码语言:javascript
复制
var r1, r2 rune
n, err = fmt.Scanf("%c%c", &r1, &r2)
fmt.Println(n, r1, r2)
if err != nil {
    log.Fatalln(err)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69741192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档