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

输入字符串而不是整数时,停止控制台多次打印相同的消息

输入字符串而不是整数时,停止控制台多次打印相同的消息

Go
繁星点点滴滴 2022-05-23 17:22:53
在我的 CLI 程序中,我有这个功能,用户可以告诉我他们想要多少特定产品的项目。因此,此输入应为整数。我目前遇到一个问题,如果他们输入一个字符串,它会出错,expected an integer但随后还会再次打印多次而不是一次。例子:How many Fruit Tea would you like to buy? qweexpected integerHow many Fruit Tea would you like to buy? expected integerHow many Fruit Tea would you like to buy? expected integerHow many Fruit Tea would you like to buy?下面是处理此功能的代码for {    fmt.Printf("How many %v would you like to buy? ", product.Name)    _, err := fmt.Scan(&response)    if err != nil {        fmt.Println(err)        continue    }    if ok, err := validResponse(response); ok {        break    } else {        fmt.Println(err)        continue    }}在这个循环中我必须改变什么,所以它只重复一次问题?
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

如果可以,将responsefrom的类型切换为int,然后使用包(例如)string解析输入字符串。我怀疑正在尝试将您输入的每个字符作为单独的 int 读取,每次都失败,并且每次都运行循环,直到所有字符都被消耗完。strconvstrconv.Atoi()Scan


例如


    for {

        var response string

        fmt.Printf("How many %v would you like to buy? ", product.Name)

        _, err := fmt.Scanln(&response)

        if err != nil { // probably don't need to check err from Scan()

            fmt.Println(err)

            continue

        }

        num, err := strconv.Atoi(response)

        if err != nil {

            fmt.Println("Enter an integer.")

            continue

        }


        if ok, err := validResponse(num); ok && err==nil {

            break

        } else {

            fmt.Println(err)

            continue

        }

    }


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信