Перейти к содержимому

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

  • автор:

rewind

Однако, в отличие от fseek этого, rewind очищает индикаторы ошибок для потока и индикатора конца файла. Кроме того, в отличие от fseek этого, rewind не возвращает значение, указывающее, был ли указатель успешно перемещен.

Чтобы очистить буфер клавиатуры, используйте rewind поток stdin , связанный с клавиатурой по умолчанию.

Если поток является NULL указателем, вызывается обработчик недопустимых параметров, как описано в разделе «Проверка параметров». Если выполнение разрешено продолжать, эта функция возвращается и errno имеет значение EINVAL .

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno , _doserrno _sys_errlist и _sys_nerr .

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью «Глобальное состояние» в CRT.

Требования

Маршрут Обязательный заголовок
rewind

Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки

Пример

// crt_rewind.c /* This program first opens a file named * crt_rewind.out for input and output and writes two * integers to the file. Next, it uses rewind to * reposition the file pointer to the beginning of * the file and reads the data back in. */ #include int main( void ) < FILE *stream; int data1, data2; data1 = 1; data2 = -37; fopen_s( &stream, "crt_rewind.out", "w+" ); if( stream != NULL ) < fprintf( stream, "%d %d", data1, data2 ); printf( "The values written are: %d and %d\n", data1, data2 ); rewind( stream ); fscanf_s( stream, "%d %d", &data1, &data2 ); printf( "The values read are: %d and %d\n", data1, data2 ); fclose( stream ); >> 

Выходные данные

The values written are: 1 and -37 The values read are: 1 and -37 

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

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

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

Сообщений: 41

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

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

Как очистить буфер клавиатуры в 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 применим только для потоков вывода.

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

Я только учу С++ и хочу сделать обработку неправильного введения пола друга. К примеру, пользователь вводит что-то кроме W и M и запрос на введение повторяется в цикле, что видно из кода. Также будет происходить, если пользователь введет много символов вместо одного. Но тут есть один момент. Дело в том, что так как тип переменной friend_sex char, то из потока ввода последовательность символов считывается посимвольно. Я написал abcd , допустим, но считалось сначала a , потом (если это в цикле, берется второй символ и происходит проверка, и так до конца). По сути, если написать abcMf , то на проверке четвертого символа цикл завершится, ибо проверка будет пройдена. Вопрос: Я хочу, чтобы при введение последовательности символов, считывался первый, а буфер ввода очищался от оставшихся. Посоветуйте, пожалуйста, функцию очистки буфера (cin.clear() не работает).

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

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