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.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, может использовать ее, и он может работать должным образом, но остерегайтесь проблем с переносимостью.