Как очистить буфер 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; }
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как программно очистить буфер обмена
using System.Runtime.InteropServices; public static extern int.
Как очистить буфер обмена в Access 2003
Вот тут встал еще один вопрос: Мне при нажатии на кнопку нужно очищать буфер обмена. Смотрю.
Или воспользуйтесь поиском по форуму:
Как очистить буфер ввода 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) но я не понимаю почему так происходит?
Что такое буфер ввода/вывода?
Объясните простым языком что такое буфер ввода или вывода, и зачем его очищать, и в каком случае его нужно очищать. В гугле ничего непонятно.
- Вопрос задан более двух лет назад
- 3332 просмотра
Комментировать
Решения вопроса 1
Для ввода-вывода в консоль или файл программа делает системные вызовы чтения или записи. Не вдаваясь в подробности, скажу, что они дорогие. Если ты читаешь по одному символу из std::cin , то это будет работать жутко медленно.
Что происходит на практике: происходит один системный вызов, cin читает в свой внутренний буфер сразу, скажем, 4096 байт, и потом отдаёт тебе из буфера по одному символу, которые ты у него запрашиваешь. Нетрудно заметить, что работать это будет (в моём примере) где-то в 4096 раз быстрее.
Зачем очищать. Пока ты не сделал flush , то, что ты вывел в поток, находится в буфере. cout ждёт, пока ты докинешь ему ещё байтиков, чтобы вывести всё потом большим куском. Если же ты хочешь, чтобы вывод произошёл прямо сейчас, то нужен flush .