При некорректном вводе в функции scanf, в потоке stdin остается мусор, и соответственно второй scanf пролетает, не запрашивая ввод. Вопрос - как наиболее правильно (корректно) очистить поток stdin (чтобы код был портабельным). Варинты1. __fpurge(stdin)
2. Использовать вспомогательный буфер и функцию fgets
3. Комбинация операторов: scanf( "%*[^\n]" ); scanf( "%*c" );
4. Другой вариант
Ваше мнение?
>При некорректном вводе в функции scanf, в потоке stdin остается мусор, и
>соответственно второй scanf пролетает, не запрашивая ввод. Вопрос - как наиболее
>правильно (корректно) очистить поток stdin (чтобы код был портабельным). Варинты
>
>1. __fpurge(stdin)
>
>2. Использовать вспомогательный буфер и функцию fgets
>
>3. Комбинация операторов: scanf( "%*[^\n]" ); scanf( "%*c" );
>
>4. Другой вариант
>
>Ваше мнение?Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз хотя ту смотря что надо
>Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз
>хотя ту смотря что надоfflush не очищает stdin (под Linux).
>
>>Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз
>>хотя ту смотря что надо
>
>fflush не очищает stdin (под Linux).
>
и не должен
см. тут http://www.opennet.me/openforum/vsluhforumID9/3180.html
кстати, по этой ссылке которую вы могли бы и сами найти (благо поиск рулит) объясняется и специфика терминалов.fflush() по posix определен только для output потоков. см man по fflush(), а так же тут http://www.unix.org. Поэтому в windows fflush(stdin) это есть не стандартное поведение, точнее это просто неправильное использование функции.
ИМХО: А в общем надо бросать scanf и переходить на всякие библиотеки readline, curses и т.п. где эти проблемы уже решены :)
>>
>>>Можно попробовать также например fflush(stdin) вроде так если мне не изменяет склероз
>>>хотя ту смотря что надо
>>
>>fflush не очищает stdin (под Linux).
>>
>и не должен
>см. тут http://www.opennet.me/openforum/vsluhforumID9/3180.html
>кстати, по этой ссылке которую вы могли бы и сами найти (благо
>поиск рулит) объясняется и специфика терминалов.
>
>fflush() по posix определен только для output потоков. см man по fflush(),
>а так же тут http://www.unix.org. Поэтому в windows fflush(stdin) это есть
>не стандартное поведение, точнее это просто неправильное использование функции.
>
>ИМХО: А в общем надо бросать scanf и переходить на всякие библиотеки
>readline, curses и т.п. где эти проблемы уже решены :)
или хотябы fgets+sscanf. по крайней мере не глючит (в сочетании с readline sscanf всеравно понадобится скорее всего)\^P^/