Ждать, пока пользователь нажимает войти в C ++? - PullRequest
2 голосов
/ 18 ноября 2011
waitForEnter() {
    char enter;

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

Работает, но не всегда. Он не работает, когда ввод вызывается непосредственно перед вызовом функции.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Вы можете использовать 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.

A select, вызывает в системе Posix, которая может сказать вам, заблокируется ли чтение из файлового дескриптора, поэтому вы можете написать функцию следующим образом:

#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 голос
/ 18 ноября 2011

В 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.

0 голосов
/ 05 июня 2013

(первый параметр) Имя массива типа char[], в котором должны храниться символы, прочитанные из cin.

(второй параметр) Максимальное количество символов для чтения. После считывания указанного максимума ввод прекращается.

(третий параметр) Символ, который должен остановить процесс ввода. Здесь вы можете указать любой символ, и первое вхождение этого символа остановит процесс ввода.

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

Page 175 IVOR HORTON'S НАЧАЛО ВИЗУАЛЬНОГО C ++ ® 2010

...