亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無效浮動的意外循環

無效浮動的意外循環

Go
呼喚遠方 2023-07-17 16:32:25
在我下面的代碼中,當用戶正確地浮動時,它可以正常工作。但是,當他們輸入一些隨機字符串時,它會打印錯誤消息并再次提示每個字符。這是為什么?package mainimport "fmt"func readFloat(title string) float64 {? var userInput float64? for {? ? fmt.Println("Please enter a float: ")? ? _, err := fmt.Scanf("%f", &userInput)? ? if err != nil {? ? ? fmt.Printf("Wooops! That's not a float\n")? ? } else {? ? ? return userInput? ? }? }}func main() {? var f float64? f = readFloat("acceleration")? ? fmt.Printf("You entered: %.04f\n", f)}~/src/coursera/go/course-2-functions-methods/week2 $ go run so.goPlease enter a float:33.3You entered: 33.3000~/src/coursera/go/course-2-functions-methods/week2 $ go run so.goPlease enter a float:sdfWooops! That's not a floatPlease enter a float:Wooops! That's not a floatPlease enter a float:Wooops! That's not a floatPlease enter a float:Wooops! That's not a floatPlease enter a float:
查看完整描述

2 回答

?
慕無忌1623718

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

第一個schar 無效,但下一次迭代將解析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")

? ? }

}



查看完整回答
反對 回復 2023-07-17
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

這是因為如果用戶輸入錯誤的值,您的 for 循環將是無限循環。return您應該在 后面有一個語句fmt.Printf("you entered wrong number"),以便 for 循環可以退出。



查看完整回答
反對 回復 2023-07-17
  • 2 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號