fmt.Scan的疑问

代码如下:

func main(){
    var input int
    for {
        if _, err := fmt.Scan(&input); err != nil {
            fmt.Printf("您输入的非法,请重新输入!%s\n",err.Error())
            continue
        }
        break
    }
    fmt.Println(input)

}

上面的代码的问题是: 如果输入是 字符串 "qqq" ,输出3句 "您输入的非法,请重新输入!expected integer",即如果输入的不是数字,是字符串。字符串有几个字符就输出几次! 我只想让他输出一次。 不需要变通方案,我就是纠结为什么会这样,fmt有没有什么方法清除“storing successive”?

已邀请:

jicg - 杂而不精

赞同来自:

没人回复啊。。。 推荐视频,纯属娱乐: 视频1 视频2

guoke267

赞同来自:

func main() {
    var input string
    for {
        if _, err := fmt.Scan(&input); err != nil {
            fmt.Printf("您输入的非法,请重新输入!%s\n", err.Error())
            continue
        }
        if val, err := strconv.Atoi(input); err != nil {
            fmt.Printf("您输入的非法,请重新输入!%s\n", err.Error())
            continue
        } else {
            fmt.Println(val)
        }
        break
    }
}

jicg - 杂而不精

赞同来自:

@guoke267 谢谢回复,不需要变通方案。

siso - 90后

赞同来自:

以下是我的猜测 原因可能是fmt包在读取你命令行的输入时 扫描第一字符不是数字时就报错了发生err!=nil 而你又在for中使用了continue,所以继续扫描第二字符发现任然是非数字继续报错 你试试qq123,它只报错2次,并且input=123

kiripeng - 90后

赞同来自:

因为你输入的是字符串,而你的input是接收的是int类型,当接收第一个'd'字符的时候,就判断不是int类型,就返回error,然后"dd"还在缓冲区里面,所以报第二个错等等。 func Scan(a ...interface{}) (n int, err error) { return Fscan(os.Stdin, a...) }//这个是scan的源码 如果是d10输入则爆出 一个错误,并输出10的值。 如果是d1d则爆出,1个错,1个1值。剩下的d在缓冲区里面。

jicg - 杂而不精

赞同来自:

重点:有什么方法能够清除缓存"storing successive"

要回复问题请先登录注册