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

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

Ответ 1

Возможно:

std::cin.ignore(INT_MAX);

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

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

Ответ 2

Я бы предпочел ограничения размера С++ над версиями 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')

Ответ 3

cin.clear();
fflush(stdin);

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

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

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

Ответ 4

Я нашел два решения.

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

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

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

Другая опция, которая напрямую отбрасывает поток, - это...

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

Удачи!

Ответ 5

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 your full name? (spaces inclded) \n";
  getline (cin, myString);
  cout << "\nHello '" << myString << "'.\n\n\n";

Ответ 6

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

cin.clear();
fflush(stdin);

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

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

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

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

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

Ответ 7

Как насчет:

cin.ignore(cin.rdbuf()->in_avail());

Ответ 8

Другим возможным (ручным) решением является

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

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

Ответ 9

Следующее должно работать:

cin.flush();

В некоторых системах он недоступен, а затем вы можете использовать:

cin.ignore(INT_MAX);

Ответ 10

#include <stdio_ext.h>

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

__fpurge(stdin)

Ответ 11

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

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

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

Ответ 12

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