waitForEnter() {
char enter;
do {
cin.get(enter);
} while ( enter != '\n' );
}
它有效,但并非总是如此。在调用函数之前按下回车键不起作用。
您可以使用getline
使程序等待任何换行符终止的输入:
#include <string>
#include <iostream>
#include <limits>
void wait_once()
{
std::string s;
std::getline(std::cin, s);
}
通常,您不能简单地“清除”整个输入缓冲区并确保此调用将始终阻塞。如果您知道要丢弃以前的输入,则可以在std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
上方添加getline
以吞噬任何剩余的字符。但是,如果一开始没有额外的输入,这将导致额外的暂停。
如果您想完全控制控制台和键盘,您可能需要查看特定于平台的解决方案,例如,像ncurses
.
Posix 系统上的select
调用可以告诉您从文件描述符读取是否会阻塞,因此您可以编写如下函数:
#include <sys/select.h>
void wait_clearall()
{
fd_set p;
FD_ZERO(&p);
FD_SET(0, &p);
timeval t;
t.tv_sec = t.tv_usec = 0;
int sr;
while ((sr = select(1, &p, NULL, NULL, &t)) > 0)
{
char buf[1000];
read(0, buf, 1000);
}
}
在 Windows 上,您可以这样做:
void WaitForEnter()
{
// if enter is already pressed, wait for
// it to be released
while (GetAsyncKeyState(VK_RETURN) & 0x8000) {}
// wait for enter to be pressed
while (!(GetAsyncKeyState(VK_RETURN) & 0x8000)) {}
}
我不知道Linux上的等价物。
(第一个参数)要存储char[]
从中读取的字符的类型数组的名称。cin
(第二个参数)要读取的最大字符数。读取指定的最大值后,输入停止。
(第三个参数)要停止输入过程的字符。您可以在此处指定任何字符,该字符的第一次出现将停止输入过程。
cin.getline( name , MAX, ‘\n’ );
第 175 页 IVOR HORTON 的VISUAL C++® 2010 开始