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

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

  • автор:

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

Собственно, вопрос в том, как сделать так, чтобы при вводе символов, коих больше, чем считывает 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

использую в тестовом примере ввод с клавиатуры с помощью scanf

 printf("введите нужное:\n"); while (GoGo != 'q') < switch (GoGo): < case 's': . case '1': . > printf("введите нужное:\n"); >

читаю чары как %c, строку как %s, целое как %i, double как %lf

в общем, во внутреннем switch строка

 printf("введите нужное:\n");

выводится ДВАЖДЫ .

т.е. видимо что-то остается в буфере!! сделал

 fflush(stdin);

перед строкой printf — никакой разницы.

как победить сие безобразие . btw, под VC++6 и mingw все отлично.

P.S. компилятор g++/Linux.

—————
c уважением, мохнато-полосатый kot—
Re: про scanf и очистку буфера

От: kot—
Дата: 15.05.07 10:54
Оценка:

Здравствуйте, kot—, Вы писали:

 printf("введите нужное:\n"); while (GoGo != 'q') < switch (GoGo): < case 's': . case '1': . > printf("введите нужное:\n"); scanf("%c",&Gogo); >

да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.

—————
c уважением, мохнато-полосатый kot—
Re: про scanf и очистку буфера

От: Dair https://dair.spb.ru
Дата: 15.05.07 11:17
Оценка:

K>вроде такого

K>

K> printf("введите нужное:\n"); K> while (GoGo != 'q') K> < K>switch (GoGo): K> < K>case 's': . K> case '1': . K> > K> printf("введите нужное:\n"); K> scanf("%c",&Gogo); K> > K>

K> как победить сие безобразие . btw, под VC++6 и mingw все отлично.

Я их вижу два (выделил в коде)
Удивлён

Может, как-нибудь так:

do < printf( "введите нужное:\n" ); scanf( "%c", &GoGo ); switch( GoGo ) < case 's': . case '1': . > > while( GoGo != 'q' );

Re[2]: про scanf и очистку буфера

От: Cruser
Дата: 15.05.07 11:21
Оценка:

K> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.

scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает

Re[3]: про scanf и очистку буфера

От: kot—
Дата: 15.05.07 11:28
Оценка:

Здравствуйте, Cruser, Вы писали:

K>> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.

C> scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает

хм. но разве fflush(stdin) буфер от него не чистит ?

—————
c уважением, мохнато-полосатый kot—
Re[4]: про scanf и очистку буфера

От: Cruser
Дата: 15.05.07 13:07
Оценка:

Здравствуйте, kot—, Вы писали:

K>Здравствуйте, Cruser, Вы писали:

K>>> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.

C>> scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает

K> хм. но разве fflush(stdin) буфер от него не чистит ?

Чистит, с ним у меня scanf() нормально работает.

Re[4]: про scanf и очистку буфера

От: night beast
Дата: 16.05.07 05:37
Оценка:

Здравствуйте, kot—, Вы писали:

K>>> да, забыл дописать — scanf после printf, но думаю и так ясен вопрос.

C>> scanf() считывает только символ ‘\r’, а вот символ ‘\n’ он на следующей итерации заглатывает

K> хм. но разве fflush(stdin) буфер от него не чистит ?

если не ошибаюсь, fflush применим только для потоков вывода.

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

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

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

Сообщений: 41

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

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

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

Рейтинг (т): 38

Если после вызова scanf ввести больше информации, чем она ожидает, то вся лишняя строка остаётся где-то в буфере и прочитывается при следующем вызове scanf. Как очистить этот буфер, чтобы при следующем вызове scanf работала с нуля?

Сообщение отредактировано: Артур — 18.01.11, 09:56

Сообщ. #2 , 18.01.11, 09:58

попробуй fflush(stdin)
постоянно ставлю после каждого вызова scanf, когда особенно читаются строковые данные.

Сообщ. #3 , 18.01.11, 09:59

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

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