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

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

14 ответов

Решение

Возможно:

std::cin.ignore(INT_MAX);

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

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

Я бы предпочел ограничения размера 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')
cin.clear();
fflush(stdin);

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

РЕДАКТИРОВАТЬ: я узнал, что предыдущее решение ухудшило положение. Этот, однако, работает:

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

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

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

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

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

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

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

Удачи!

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";

Как насчет:

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

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

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

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

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

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 для альтернативы.

У меня это сработало. Я использовал цикл for с getline().

cin.ignore()

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

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

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

#include <stdio_ext.h>

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

__fpurge(stdin)

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

cin.flush();

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

cin.ignore(INT_MAX);

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

fflush(stdin) — используется для очистки памяти входного буфера. Рекомендуется использовать перед написанием оператора scanf.

fflush(stdout) — используется для очистки памяти выходного буфера. Рекомендуется использовать перед оператором printf. Следующее должно работать:

цин.флеш(); В некоторых системах он недоступен, и тогда вы можете использовать:

cin.игнорировать (INT_MAX); И Windows, и Linux определяют поведение fflush() для входного потока и даже определяют его одинаково (чудо из чудес). Стандарты POSIX, C и C++ для fflush() не определяют поведение, но ни один из них не запрещает системе определять его. Если вы пишете код для максимальной переносимости, избегайте fflush(stdin); если вы пишете код для платформ, которые определяют поведение, используйте его, но имейте в виду, что это не переносимый переносимый код, не использующий fflush(stdin). Код, привязанный к платформе Microsoft, может использовать ее, и он может работать должным образом, но остерегайтесь проблем с переносимостью.

Другие вопросы по тегам