登录
首页 >  Golang >  Go问答

如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?

来源:Golang技术栈

时间:2023-04-05 09:56:31 270浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?》,就很适合你!文章讲解的知识点主要包括golang,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

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

// 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,进程正常退出。_ ”

但是尝试输入一个字符串呢?

请输入一个整数:“ 什么?
抱歉,输入无效。请输入一个整数:
㈥㏒对不起,输入无效。请输入整数:
㈥㏒orry...

等等,它会逐个字符地循环,直到字符串用完。即使输入一个字符循环两次,我假设它解析换行符。

无论如何,一定有办法在 Go 中刷新 Stdin?

PS 如果没有这样的功能,您将如何解决它以提供等效的功能?我什至都失败了...

正确答案

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

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)
}

本篇关于《如何在 Go 中的 fmt.Scanf() 之后刷新标准输入?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表