首页  >  文章  >  后端开发  >  为什么 Go 中 fmt.Scanf() 会导致无限循环且输入无效?

为什么 Go 中 fmt.Scanf() 会导致无限循环且输入无效?

Patricia Arquette
Patricia Arquette原创
2024-10-27 04:23:30356浏览

Why Does fmt.Scanf() Cause an Infinite Loop with Invalid Input in Go?

Go 的 fmt.Scanf 中如何处理无效输入

对于那些在使用 fmt.Scanf() 时遇到无效输入问题的人来说,这是对于理解为什么当输入字符串而不是整数时程序会进入无限循环至关重要。

在 Go 中,fmt.Scanf() 会解析输入流以获取特定的格式说明符(例如,“%d” " 对于十进制整数)。无效输入(例如字符串)会导致错误,但输入仍保留在 Stdin 缓冲区中。因此,对 fmt.Scanf() 的后续调用将继续处理相同的无效输入,从而导致无限循环。

使用 fmt.Scanln 的解决方案

另一种方法是使用 fmt.Scanln(),其行为不同。它读取并使用整行输入,包括任何无效字符。这可以按如下方式实现:

<code class="go">fmt.Printf("Please enter an integer: ")

// Read in an integer
var i int
_, err := fmt.Scanln(&i)
if err != nil {
    fmt.Printf("Error: %s", err.Error())

    // If int read fails, read as string and forget
    var discard string
    fmt.Scanln(&discard)
    return
}
fmt.Printf("Input contained %d", i)</code>

其他选项

如果 fmt.Scanln() 不是最佳的,其他选项包括:

  • 重置 Stdin 缓冲区:使用 bufio.Reader.Reset() 或 bufio.NewReader() 清除缓冲区。
  • 自定义输入验证:创建重复读取和验证输入直到收到有效输入的循环。
  • 使用专用输入库:考虑使用 bufio.Reader 等库,它可以对输入处理提供更多控制。

以上是为什么 Go 中 fmt.Scanf() 会导致无限循环且输入无效?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn