目前,这是一个困扰我的问题。当从用户那里获得输入时,我想采用一个循环来要求用户重试,直到他们输入有效的输入为止:// 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)
}
一只斗牛犬
TA贡献1784条经验 获得超2个赞
我知道这已经得到回答,但这是我的实现:
func flush (reader *bufio.Reader) {
var i int
for i = 0; i < reader.Buffered(); i++ {
reader.ReadByte()
}
}
这应该在每种情况下都适用,包括无法使用“ stdin.ReadString('\ n')”的情况。
- 3 回答
- 0 关注
- 234 浏览
添加回答
举报
0/150
提交
取消