Golang——Scanf,Scanln循环多次输入的小坑

在Go语言中,使用fmt包的Scan、Scanf、Scanln进行用户输入时,可能会遇到因缓冲区残留换行符导致的问题。文章详细描述了在for循环中输入字符时,第二次循环被跳过的原因,并分析了fmt.Scanf函数遇到的'unexpected newline'错误。解决方案包括在输入格式中添加换行符或使用bufio包的NewReader和ReadString方法来清除缓冲区的换行符。通过这些方法,可以确保正确读取用户输入并避免错误的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在for循环中输入一个字符

var choice byte

fmt.Scanf("%c",&choice)

 在第二次循环时,该输入语句会被直接跳过。

 官方文档中该函数有返回遇到的错误

进行测试后发现

0
unexpected newline

 判断是将换行符当作字符读取了

想到可能是由于在缓冲区中仍存在上一次输入留下的换行符(\n)

于是在语句中加上换行符

fmt.Scanf("%c \n",&choice)

 可以正常输入。

在其他地方看到的解决方法

go fmt.Scan Scanf Scanln的一个小问题_xychidy520_java的博客-优快云博客_scanf和scanln

使用bufio包解决

Scan,Scanf,Scanln的一个问题

go的fmt.Scan在使用中的一个小问题,如下:

for{
    fmt.Println("请选择:1-剪刀 2-石头 3-布 ,0-不玩了")
    count, err := fmt.Scan(&people)
    if err != nil {
        fmt.Println(err)
        fmt.Printf("count:%d\n", count)
        fmt.Println("您的输入有误,请重新输入")
        continue
    }
    //其他逻辑代码
}

这段代码在我正常输入数字的情况下是没有问题的,可以正常获取数值,但是输入非数字的情况下,就会出现,“输入多少个字符,if块里的错误代码就会执行多少遍的情况。”

请选择:1-剪刀 2-石头 3-布 ,0-不玩了
1
您出的是[剪刀],电脑出的是[布]
***********您输了!!***********
请选择:1-剪刀 2-石头 3-布 ,0-不玩了
ab
expected integer
count:0您的输入有误,请重新输入
请选择:1-剪刀 2-石头 3-布 ,0-不玩了
expected integer
count:0您的输入有误,请重新输入
请选择:1-剪刀 2-石头 3-布 ,0-不玩了
abc
expected integer
count:0您的输入有误,请重新输入
请选择:1-剪刀 2-石头 3-布 ,0-不玩了
expected integer
count:0您的输入有误,请重新输入
请选择:1-剪刀 2-石头 3-布 ,0-不玩了
expected integer
count:0您的输入有误,请重新输入
请选择:1-剪刀 2-石头 3-布 ,0-不玩了

感觉是continue之后fmt.Scan()函数并没有重新从标准输入里读取,而是读取到了第一次输入的整个字符串中的下一个字符。
更换使用Scanln或者Scanf后,问题同样存在。

最后采用bufio.NewReader才彻底解决。

for{
    fmt.Println("请选择:1-剪刀 2-石头 3-布 ,0-不玩了")
    stdin := bufio.NewReader(os.Stdin)
    count, err := fmt.Fscan(stdin, &people)
    stdin.ReadString('\n')
    if err != nil {
        fmt.Println(err)
        fmt.Printf("count:%d\n", count)
        fmt.Println("您的输入有误,请重新输入")
        continue
    }
    //其他逻辑代码
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值