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 關注
- 170 瀏覽
添加回答
舉報