为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的循环不按照描述的顺序执行命令

为什么我的循环不按照描述的顺序执行命令

Go
梵蒂冈之花 2022-12-19 10:37:09
现在我正在努力学习围棋。我有代码:package mainimport (    "bufio"    "fmt"    "os")func main() {    var wallCount int    var width, height, area float64    var r = bufio.NewReader(os.Stdin)    fmt.Print("WallCount:")    fmt.Scanf("%d", &wallCount)    fmt.Printf("wallcount =  %v \n", wallCount)    for x := 1; x <= wallCount; x++ {        fmt.Printf("wight, height at %v times\n", x)        fmt.Fscanf(r, "%d %d", &width, &height)        area += width * height    }    fmt.Printf("area =  %v\n", area)}当我编译代码时在终端上:WallCount:进入第 4 学期WallCount:4---wallcount =  4wight, height at 1 timeswight, height at 2 times传递到第 1,1 项WallCount:4wallcount =  4wight, height at 1 timeswight, height at 2 times1,1---wight, height at 3 timeswight, height at 4 timesarea =  0你能解释一下吗为什么我for loops运行第一个 cmd 两次,然后运行第二个 cmd,然后再次运行第一个 cmd 两次,最后运行最后一个 cmd?为什么area包含 0 ?
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

这里有一些问题。首先,您使用%d了表示整数值的 ,而您使用的是浮点值(使用%f)。


此函数:fmt.Fscanf(r, "%d %d", &width, &height)返回两个值。第一个值是它成功解析的项目数,第二个值是一个错误。您应该始终检查返回的错误是否不是nil,这意味着有错误:


func main() {

    var wallCount int

    var width, height, area float64

    var r = bufio.NewReader(os.Stdin)

    fmt.Print("WallCount:")

    fmt.Scanf("%d", &wallCount)

    fmt.Printf("wallcount =  %v \n", wallCount)

    for x := 1; x <= wallCount; x++ {

        fmt.Printf("wight, height at %v times\n", x)

        _, err := fmt.Fscanf(r, "%f %f\n", &width, &height)

        if err != nil {

            log.Println(err)

            return

        }

        area += width * height

    }


    fmt.Printf("area =  %v\n", area)

}

在这种情况下,错误非常清楚地描述出了什么问题,即:bad verb '%d' for float64。在 go 中,这种检查错误是否为 nil 的形式非常常见,您应该始终检查错误。


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号