Как очистить буфер cin? - PullRequest
101 голосов
/ 02 ноября 2008

Как очистить буфер cin в C ++?

Ответы [ 12 ]

106 голосов
/ 02 ноября 2008

Я бы предпочел ограничения размера C ++ по сравнению с версиями C:

// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
91 голосов
/ 02 ноября 2008

Возможно:

std::cin.ignore(INT_MAX);

Это будет читать и игнорировать все до EOF. (Вы также можете указать второй аргумент - символ, который нужно прочитать до (например: '\n', чтобы игнорировать одну строку).

Также: Вы, вероятно, хотите сделать: std::cin.clear(); перед этим, чтобы сбросить состояние потока.

20 голосов
/ 19 мая 2014
cin.clear();
fflush(stdin);

Это было единственное, что работало для меня при чтении с консоли. В любом другом случае он либо будет считываться бесконечно из-за отсутствия \ n, либо что-то останется в буфере.

EDIT: Я узнал, что предыдущее решение ухудшило ситуацию. Этот, однако, работает:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
7 голосов
/ 29 декабря 2015

Я нашел два решения для этого.

Первый и самый простой способ - использовать std::getline(), например:

std::getline(std::cin, yourString);

... который отбрасывает входной поток при переходе на новую строку. Подробнее об этой функции здесь .

Еще одна опция, которая напрямую отбрасывает поток, это ...

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

Удачи!

7 голосов
/ 09 октября 2009
int i;
  cout << "Please enter an integer value: ";

  // cin >> i; leaves '\n' among possible other junk in the buffer. 
  // '\n' also happens to be the default delim character for getline() below.
  cin >> i; 
  if (cin.fail()) 
  {
    cout << "\ncin failed - substituting: i=1;\n\n";
    i = 1;
  }
  cin.clear(); cin.ignore(INT_MAX,'\n'); 

  cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";

  string myString;
  cout << "What's your full name? (spaces inclded) \n";
  getline (cin, myString);
  cout << "\nHello '" << myString << "'.\n\n\n";
3 голосов
/ 07 августа 2015

Другое возможное (ручное) решение -

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

Я не могу использовать fflush или cin.flush () с CLion, так что это пригодилось.

3 голосов
/ 11 февраля 2009

Как насчет:

cin.ignore(cin.rdbuf()->in_avail());
3 голосов
/ 02 ноября 2008

Я предпочитаю:

cin.clear();
fflush(stdin);

Есть пример, когда cin.ignore просто не обрезает это, но я не могу думать об этом в данный момент. Это было некоторое время назад, когда мне нужно было использовать его (с Mingw).

Однако fflush (stdin) - неопределенное поведение в соответствии со стандартом. fflush () предназначен только для выходных потоков. fflush (stdin) работает только так, как и ожидалось в Windows (хотя бы с компиляторами GCC и MS) как расширение стандарта C .

Так что, если вы используете его, ваш код не будет переносимым.

См. Использование fflush (stdin) .

Также см. http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 для альтернативы.

1 голос
/ 25 сентября 2017

Самый простой способ:

cin.seekg(0,ios::end);
cin.clear();

Он просто помещает указатель cin в конец потока stdin, а cin.clear () очищает все флаги ошибок, такие как флаг EOF.

1 голос
/ 08 ноября 2014
#include <stdio_ext.h>

и затем используйте функцию

__fpurge(stdin)
...