Как очистить буфер ввода c
Перейти к содержимому

Как очистить буфер ввода c

  • автор:

Как очистить буфер scanf() ?

Мне нужно, чтобы scanf() вызывался до тех пор, пока не будет введено целое число, но происходит зацикливание.

1 2 3 4
while (scanf("%d", &n) != 1 ) { printf("Error\nInput n: "); }

fflush(stdin) — не помогает
scanf( «%*[^\n]» ); — помог, но я не понимаю, как это работает.

1 2 3 4 5
while (scanf("%d", &n) != 1) { scanf("%*[^\n]"); printf("Error\nInput n: "); }

Есть ли более простой способ очистить буфер?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как очистить буфер.
Извините, за вопрос из облатси VBA, но там в конфе глухо, да и проблема не только VBA’шная. .

Как очистить буфер com-порта?
В этой программе я считываю данные с lpt-порта и в зависимости от полученных значений, посылаю.

Как очистить буфер обмена?
вот собственно и весь вопрос Заранее спасибо

Как очистить буфер клавиатуры?
Есть меню в котором я двигаю стрелочку кнопками вверх и вниз и нажимаю ентер. while (true)
Регистрация: 25.01.2016
Сообщений: 39

1 2 3 4 5
while (scanf("%d", &n) != 1 ) { rewind(stdin); printf("Error\nInput n: "); }

48 / 48 / 57
Регистрация: 25.11.2015
Сообщений: 140

Вот держи. наверное не совсем элегантный вариант но scanf() будет выполняться пока не будет введено целое число.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include float myFunc(void); int main (void) { int a; a = 0; while (myFunc() != 1) { puts("Repeat enter"); } return 0; } float myFunc (void) { float a, c; int b; scanf("%f", &a); b = a; if ((c = (b / a)) > 0) return c; else return 0; }

Сброс буфера ввода

Собственно, вопрос в том, как сделать так, чтобы при вводе символов, коих больше, чем считывает fgets , они не оставались в, мм, буфере? Иначе я ввожу ~100 символов при первом приглашении ввода, он читает 65 штук, остальное отправляет сразу во второй fgets , и, естественно, так быть не должно. Вот тут fflush(stdin) , но эффекта нет: всё равно отправляет «остаток» во второй fgets . С _flushall(); немного иначе: он срабатывает, но выборочно, раз через два, почему — не могу понять. Компилятор: «Оптимизирующий компилятор Майкрософт С/С++ версии 19.00.23506«

/GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\ConsoleApplication2.pch" 

Отслеживать

6,641 6 6 золотых знаков 30 30 серебряных знаков 52 52 бронзовых знака

Как очистить буфер ввода c

Пользователь

Регистрация: 05.11.2009

Сообщений: 41

Очистка буфера ввода консоли

При вводе в буфере консоли остаётся мусор — последняя введенная строка. fflush(stdin) не помогает очистить.
Программа эмуляция бд — ввожу новую запись пять строк и одно число. Потом пытаюсь редактировать и в первый ввод scanf или gets попадает то что вводил до этого. Вроде проблему решило fseek(stdin, 0, SEEK_END) но я не понимаю почему так происходит?

Что такое буфер ввода/вывода?

Объясните простым языком что такое буфер ввода или вывода, и зачем его очищать, и в каком случае его нужно очищать. В гугле ничего непонятно.

  • Вопрос задан более двух лет назад
  • 3172 просмотра

Комментировать
Решения вопроса 1

Anton3

Для ввода-вывода в консоль или файл программа делает системные вызовы чтения или записи. Не вдаваясь в подробности, скажу, что они дорогие. Если ты читаешь по одному символу из std::cin , то это будет работать жутко медленно.

Что происходит на практике: происходит один системный вызов, cin читает в свой внутренний буфер сразу, скажем, 4096 байт, и потом отдаёт тебе из буфера по одному символу, которые ты у него запрашиваешь. Нетрудно заметить, что работать это будет (в моём примере) где-то в 4096 раз быстрее.

Зачем очищать. Пока ты не сделал flush , то, что ты вывел в поток, находится в буфере. cout ждёт, пока ты докинешь ему ещё байтиков, чтобы вывести всё потом большим куском. Если же ты хочешь, чтобы вывод произошёл прямо сейчас, то нужен flush .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *