Как очистить буфер cin в C ++?
Как очистить буфер cin в C ++?
Ответы:
Возможно:
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
и использую первый оператор выше для очистки cin
буфера, он продолжает запрашивать ввод, пока я не войду EOF
нажатием ctrl+d
?
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.ignore просто не сокращает его, но я не могу об этом сейчас думать. Это было некоторое время назад, когда мне нужно было использовать его (с 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.seekg(0,ios::end);
cin.clear();
Он просто помещает указатель cin в конец потока stdin, а cin.clear () очищает все флаги ошибок, такие как флаг EOF.
Следующее должно работать:
cin.flush();
В некоторых системах это недоступно, и тогда вы можете использовать:
cin.ignore(INT_MAX);
flush
метод предназначен только для вывода и имеет дело с уже написанными символами.
basic_istream<char>' has no member named 'flush'
cin.get()
кажется, как ни странно, автоматически смывает его (хотя, вероятно, не рекомендуется, поскольку это сбивает с толку и, вероятно, темпераментно).
У меня это сработало. Я использовал цикл for с getline ().
cin.ignore()