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

目前,这是一个困扰我的问题。当从用户那里获得输入时,我想采用一个循环来要求用户重试,直到他们输入有效的输入为止:


// user_input.go

package main


import (

    "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在没有此类功能的情况下,您将如何解决该功能以提供等效功能?即使那样我也失败了...


红颜莎娜
浏览 235回答 3
3回答

慕桂英4014372

我将通过在每次失败后读取直到行尾来解决此问题。这将清除其余的文本。package mainimport (    "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)}

一只斗牛犬

我知道这已经得到回答,但这是我的实现:func flush (reader *bufio.Reader) {&nbsp; &nbsp; var i int&nbsp; &nbsp; for i = 0; i < reader.Buffered(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; reader.ReadByte()&nbsp; &nbsp; }}这应该在每种情况下都适用,包括无法使用“ stdin.ReadString('\ n')”的情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go