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



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

744   12  

12 ответов:

возможно:

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();
fflush(stdin);

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

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

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

посмотреть С помощью fflush (stdin).

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

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

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

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

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

cin.flush();

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

cin.ignore(INT_MAX);
#include <stdio_ext.h>

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

__fpurge(stdin)

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

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

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

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

Comments

    Ничего не найдено.