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.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);
самый простой способ:
cin.seekg(0,ios::end); cin.clear();Он просто позиционирует указатель cin в конце потока stdin и cin.clear () удаляет все флаги ошибок, такие как флаг EOF.
cin.get()кажется, чтобы смыть его автоматически достаточно странно (вероятно, не предпочтительно, хотя, так как это сбивает с толку и, вероятно, темпераментный).
Comments