Як очистити буфер 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, або щось залишатиметься в буфері.
EDIT: Я дізнався, що попереднє рішення погіршило ситуацію. Це, однак, працює:
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()
Здається, це автоматично змиває його досить дивно (хоча, мабуть, не бажано, оскільки це заплутано і, ймовірно, темпераментно).
Це працювало для мене. Я використовував для циклу з getline ().
cin.ignore()