scan导致多次输出

1. 问题描述?

想判断用户输入的是否是数字,如果不是则重新输入,先设置了一个变量类型为int,如果用户输入的值是一个数字,就正常运行。



如果用户输入的是字符串,err错误类型为expected integer,假设用户输入的是两个字符那么就会输出两次请输入数字,三个字符串则三次。


请教一下怎么在用户输出的不是数字时提示一次请输入数字,并让用户重新输入

最佳答案

根据简单的测试结果,像是逐字符解析的(具体未知,暂未找到相关文档),你试一下数字和字母的混合输入并变换一下顺序会发现:当解析到非数字时,抛出错误,解析到数字或连续数字时,获取数字并结束

可能这样更准确一些:按顺序解析字符的时候,解析失败,触发异常,进入下一次循环,下一个循环里的 Scan 继续解析剩余输入缓冲区的内容,如此循环

3周前 评论
cccq (楼主) 3周前
讨论数量: 12

读字符串,然后转成 int 会不会好一些。

func main() {
    var num int
    for {
        fmt.Println("输入一个数字")
        line, err := bufio.NewReader(os.Stdin).ReadString('\n')
        if err != nil {
            continue
        }
        line = strings.Trim(line, "\r\n")
        num, err = strconv.Atoi(line)
        if err == nil {
            break
        }
    }
    fmt.Println("结束", num)
}
3周前 评论
yxuefeng (作者) 3周前
yxuefeng (作者) 3周前
cccq (楼主) 3周前

需要 num 类型修改为 string, 还有就是如果要判断是否为数字建议用正则

file

3周前 评论
xuesongtao (作者) 3周前
xuesongtao (作者) 3周前
cccq (楼主) 3周前

根据简单的测试结果,像是逐字符解析的(具体未知,暂未找到相关文档),你试一下数字和字母的混合输入并变换一下顺序会发现:当解析到非数字时,抛出错误,解析到数字或连续数字时,获取数字并结束

可能这样更准确一些:按顺序解析字符的时候,解析失败,触发异常,进入下一次循环,下一个循环里的 Scan 继续解析剩余输入缓冲区的内容,如此循环

3周前 评论
cccq (楼主) 3周前

就是输入非法的字符,scan接收到了存在缓冲区,直接跳过当次非法字符,但把回车等后续多余的字符接着被代码循环接收了。这问题很常见,用bufio.NewReader判断输入的字符正不正确,然后转换格式比较好。你搜索go搜不到多少东西,但是你换成c语言去搜,就有很多解释了,这玩意就是c语言的。 :joy: :joy:

3周前 评论
cccq (楼主) 3周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!