URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5981
[ Назад ]

Исходное сообщение
"Самый правильный способ очистить stdin. Ваше мнение"

Отправлено newbie , 03-Дек-06 13:24 
При некорректном вводе в функции scanf, в потоке stdin остается мусор, и соответственно второй scanf пролетает, не запрашивая ввод. Вопрос - как наиболее правильно (корректно) очистить поток stdin (чтобы код был портабельным). Варинты

1. __fpurge(stdin)

2. Использовать вспомогательный буфер и функцию fgets

3. Комбинация операторов: scanf( "%*[^\n]" ); scanf( "%*c" );

4. Другой вариант

Ваше мнение?


Содержание

Сообщения в этом обсуждении
"Самый правильный способ очистить stdin. Ваше мнение"
Отправлено red_mould , 03-Дек-06 15:26 
>При некорректном вводе в функции scanf, в потоке stdin остается мусор, и
>соответственно второй scanf пролетает, не запрашивая ввод. Вопрос - как наиболее
>правильно (корректно) очистить поток stdin (чтобы код был портабельным). Варинты
>
>1. __fpurge(stdin)
>
>2. Использовать вспомогательный буфер и функцию fgets
>
>3. Комбинация операторов: scanf( "%*[^\n]" ); scanf( "%*c" );
>
>4. Другой вариант
>
>Ваше мнение?

Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз хотя ту смотря что надо


"Самый правильный способ очистить stdin. Ваше мнение"
Отправлено newbie , 03-Дек-06 16:48 

>Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз
>хотя ту смотря что надо

fflush не очищает stdin (под Linux).
    



"Самый правильный способ очистить stdin. Ваше мнение"
Отправлено vic , 04-Дек-06 12:17 
>
>>Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз
>>хотя ту смотря что надо
>
>fflush не очищает stdin (под Linux).
>
и не должен
см. тут https://www.opennet.ru/openforum/vsluhforumID9/3180.html
кстати, по этой ссылке которую вы могли бы и сами найти (благо поиск рулит) объясняется и специфика терминалов.

fflush() по posix определен только для output потоков. см man по fflush(), а так же тут http://www.unix.org. Поэтому в windows fflush(stdin) это есть не стандартное поведение, точнее это просто неправильное использование функции.

ИМХО: А в общем надо бросать scanf и переходить на всякие библиотеки readline, curses и т.п. где эти проблемы уже решены :)


"Самый правильный способ очистить stdin. Ваше мнение"
Отправлено perece , 04-Дек-06 18:54 
>>
>>>Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз
>>>хотя ту смотря что надо
>>
>>fflush не очищает stdin (под Linux).
>>
>и не должен
>см. тут https://www.opennet.ru/openforum/vsluhforumID9/3180.html
>кстати, по этой ссылке которую вы могли бы и сами найти (благо
>поиск рулит) объясняется и специфика терминалов.
>
>fflush() по posix определен только для output потоков. см man по fflush(),
>а так же тут http://www.unix.org. Поэтому в windows fflush(stdin) это есть
>не стандартное поведение, точнее это просто неправильное использование функции.
>
>ИМХО: А в общем надо бросать scanf и переходить на всякие библиотеки
>readline, curses и т.п. где эти проблемы уже решены :)
или хотябы fgets+sscanf. по крайней мере не глючит (в сочетании с readline sscanf всеравно понадобится скорее всего)

\^P^/