等到用户按下C ++进入?

时间:2011-11-18 03:21:35

标签: c++ windows linux cin enter

waitForEnter() {
    char enter;

    do {
        cin.get(enter);
    } while ( enter != '\n' );
}

它有效,但并非总是如此。在调用函数之前按下enter时它不起作用。

3 个答案:

答案 0 :(得分:2)

您可以使用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);
  }
}

答案 1 :(得分:1)

在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上的等价物。

答案 2 :(得分:0)

(第一个参数)要存储从char[]读取的字符的cin类型数组的名称。

(第二个参数)要读取的最大字符数。读取指定的最大值后,输入将停止。

(第三个参数)用于停止输入过程的字符。您可以在此处指定任何字符,该字符的第一个匹配项将停止输入过程。

cin.getline( name , MAX, ‘\n’ );

Page 175 IVOR HORTON'S BEGINNING VISUAL C ++®2010