c++ - 在 C++ 中清除键盘缓冲区

标签 c++

我在应用程序的一部分中使用了Sleep(5000)(我需要等待 5 秒)

问题是,如果用户在这 5 秒内按下任何键盘键,这些键将在 sleep 后读取,这会导致我的应用出现问题。

sleep 后如何清空缓冲区?

我尝试了 cin.clear()setbuf(stdin, NULL) 但如果缓冲区中有多个字符,它们将无法清除缓冲区。

最佳答案

您正在使用的两个函数没有达到您期望的效果:

  1. clear() 根本不影响缓冲区,而是清除错误标志。即,如果读取不成功,则设置标志 (std::ios_base::failbit)。虽然设置了任何错误标志(还有更多),但流不会尝试读取任何内容。
  2. setbuf(0, 0) 影响流的内部缓冲区不存在(具有非空值的调用具有实现定义的含义,通常是“什么都不做”)。这通常是一个坏主意,因为它会导致流非常慢。此外,用户按下的键可能不会存储在这个缓冲区中,而是存储在操作系统输入缓冲区中,直到它们被发送到应用程序(有特定于平台的方法来关闭操作系统输入缓冲区,例如,在 POSIX 上你将使用 tcsetattr() 将输入设置为非规范模式)。

在任何一种情况下,没有缓冲区并不能真正帮助您:用户很可能输入了有效的输入。正确的方法是尝试读取可用的输入,如果失败,则删除有问题的字符(或多个字符)。为此,您将尝试读取输入,如果失败,您将 clear() 流和 ignore() 一个或多个字符(此示例忽略一个整行;不带参数调用 ignore() 只忽略一个字符):

T value;
while (!(std::cin >> value)) {
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

无论如何,您始终需要验证输入是否成功,而额外的几行只是添加了一些恢复代码。

关于c++ - 在 C++ 中清除键盘缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13986794/

相关文章:

C++ 使用 Bind 创建线程的问题

c++ - 调整大小以适应 QTableView 中的行和列非常慢

c++ - 用任务管理器杀死时如何防止内存泄漏

c++ - 如何为大量 header 生成 .pch?

c++ - 使用 CreateProcess 尽可能使用单个命令参数调用 exec* 函数

c++ - qt 5中的信号槽问题

c++ - 如何释放使用 C++ "new"运算符分配的 C 中的内存

c++ - 在 C++ 中用 '$' 编写原始字符串的正确格式是什么?

c++ - 与 libmx 链接并使用 std::stringstream 时出现 g++ malloc 错误

c++ - 有什么办法可以分离从 getcontext() 获得的上下文堆栈吗?