2 回答
TA贡献1744条经验 获得超4个赞
问题是,如果fmt.Scanf()
遇到无效输入,它将停止消耗它。例如,您想使用 解析浮点数%f
,但如果用户输入sdf
,fmt.Scanf()
将知道它在第一个s
字符后无效,因此返回错误并且不会消耗其余字符。
因此,下一个循环迭代开始,它消耗第二个字符d
,这又是无效的等等。
s2
例如,如果您尝试输入,这一点就会变得清晰:
Please enter a float:
s2
Wooops! That's not a float
Please enter a float:
You entered: 2.0000
第一个s
char 无效,但下一次迭代将解析2
。
“修复”此问题的一种方法是将整行读取为字符串,然后尝试从字符串中解析浮点数。要读取一行,请使用bufio.Scanner
,要解析浮点数,请使用strconv.ParseFloat()
。
以下是如何执行此操作的示例:
func readFloat(title string) float64 {
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Printf("Please enter a float for %s: ", title)
if !scanner.Scan() {
fmt.Println("Error readling line")
return 0 // Should return an error too!
}
line := scanner.Text()
userInput, err := strconv.ParseFloat(line, 64)
if err == nil {
return userInput
}
fmt.Printf("Wooops! That's not a float\n")
}
}
TA贡献1784条经验 获得超2个赞
这是因为如果用户输入错误的值,您的 for 循环将是无限循环。return
您应该在 后面有一个语句fmt.Printf("you entered wrong number")
,以便 for 循环可以退出。
- 2 回答
- 0 关注
- 136 浏览
添加回答
举报