为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中的fmt.Scanf()之后刷新Stdin?

如何在Go中的fmt.Scanf()之后刷新Stdin?

Go
红颜莎娜 2021-04-28 14:12:25
目前,这是一个困扰我的问题。当从用户那里获得输入时,我想采用一个循环来要求用户重试,直到他们输入有效的输入为止:// user_input.gopackage mainimport (    "fmt")func main() {    fmt.Println("Please enter an integer: ")    var userI int    for {        _, err := fmt.Scanf("%d", &userI)        if err == nil {            break        }        fmt.Println("Sorry, invalid input. Please enter an integer: ")    }    fmt.Println(userI)    }运行上面的命令,如果用户输入有效的输入,则没有问题:请输入一个整数: 
3
3
退出代码0,进程正常退出。
但是,请尝试输入字符串呢?请输入一个整数: 
什么?抱歉,输入无效。请输入一个整数:
对不起,输入无效。请输入一个整数:
对不起...等等,它会不断地逐个字符地循环,直到字符串用尽为止。即使输入单个字符也会循环两次,我假设它会解析换行符。无论如何,必须有一种在Go中刷新Stdin的方法吗?PS在没有此类功能的情况下,您将如何解决该功能以提供等效功能?即使那样我也失败了...
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

我将通过在每次失败后读取直到行尾来解决此问题。这将清除其余的文本。


package main


import (

    "bufio"

    "fmt"

    "os"

)


func main() {

    stdin := bufio.NewReader(os.Stdin)


    fmt.Println("Please enter an integer: ")


    var userI int


    for {

        _, err := fmt.Fscan(stdin, &userI)

        if err == nil {

            break

        }


        stdin.ReadString('\n')

        fmt.Println("Sorry, invalid input. Please enter an integer: ")

    }


    fmt.Println(userI)

}


查看完整回答
反对 回复 2021-05-31
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我知道这已经得到回答,但这是我的实现:


func flush (reader *bufio.Reader) {

    var i int

    for i = 0; i < reader.Buffered(); i++ {

        reader.ReadByte()

    }

}

这应该在每种情况下都适用,包括无法使用“ stdin.ReadString('\ n')”的情况。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信