2 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
問(wèn)題是,如果fmt.Scanf()
遇到無(wú)效輸入,它將停止消耗它。例如,您想使用 解析浮點(diǎn)數(shù)%f
,但如果用戶輸入sdf
,fmt.Scanf()
將知道它在第一個(gè)s
字符后無(wú)效,因此返回錯(cuò)誤并且不會(huì)消耗其余字符。
因此,下一個(gè)循環(huán)迭代開(kāi)始,它消耗第二個(gè)字符d
,這又是無(wú)效的等等。
s2
例如,如果您嘗試輸入,這一點(diǎn)就會(huì)變得清晰:
Please enter a float:?
s2
Wooops! That's not a float
Please enter a float:?
You entered: 2.0000
第一個(gè)s
char 無(wú)效,但下一次迭代將解析2
。
“修復(fù)”此問(wèn)題的一種方法是將整行讀取為字符串,然后嘗試從字符串中解析浮點(diǎn)數(shù)。要讀取一行,請(qǐng)使用bufio.Scanner
,要解析浮點(diǎn)數(shù),請(qǐng)使用strconv.ParseFloat()
。
以下是如何執(zhí)行此操作的示例:
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貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
這是因?yàn)槿绻脩糨斎脲e(cuò)誤的值,您的 for 循環(huán)將是無(wú)限循環(huán)。return
您應(yīng)該在 后面有一個(gè)語(yǔ)句fmt.Printf("you entered wrong number")
,以便 for 循環(huán)可以退出。
- 2 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)