您的位置:首页 >Go语言清除Stdin缓冲区方法详解
发布于2026-01-16 阅读(0)
扫一扫,手机访问

在使用 fmt.Scanf() 从标准输入读取数据时,如果用户输入了无效的数据,例如期望输入整数却输入了字符串,fmt.Scanf() 会返回一个错误,并且无效的输入会残留在标准输入缓冲区中。在循环中重复调用 fmt.Scanf() 时,由于缓冲区中仍然存在无效数据,程序会不断地读取到这些数据,导致无限循环。
解决这个问题的一种有效方法是使用 bufio 包来创建一个带缓冲的读取器,并在每次读取失败后清除缓冲区。bufio.NewReader 函数可以创建一个新的带缓冲的读取器,它从指定的 io.Reader 读取数据,这里我们可以使用 os.Stdin 作为输入源。bufio.Reader 提供了 ReadString('\n') 方法,可以读取直到遇到换行符为止的所有数据,并将这些数据从缓冲区中清除。
以下是一个示例代码,演示了如何使用 bufio 包来清除 fmt.Scanf() 后的标准输入缓冲区:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
stdin := bufio.NewReader(os.Stdin)
fmt.Println("Please enter an integer: ")
var userI int
for {
_, err := fmt.Fscan(stdin, &userI)
if err == nil {
break
}
stdin.ReadString('\n') // 清除缓冲区
fmt.Println("Sorry, invalid input. Please enter an integer: ")
}
fmt.Println(userI)
}代码解释:
运行示例:
如果用户输入有效的整数,程序会正常读取并输出:
Please enter an integer: 3 3
如果用户输入无效的字符串,程序会提示用户重新输入,并清除缓冲区,避免无限循环:
Please enter an integer: what? Sorry, invalid input. Please enter an integer: 5 5
注意事项:
总结:
本文介绍了如何使用 bufio 包来清除 fmt.Scanf() 后的标准输入缓冲区,避免由于无效输入导致的无限循环。通过使用 bufio.NewReader 和 ReadString('\n') 方法,我们可以有效地处理标准输入,并提供更友好的用户体验。 掌握这种技巧对于编写交互式命令行程序至关重要。
下一篇:米坛社区网页版入口及访问指南
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9