>>Сходил. Да, круто вы там все разложили. Вот уж никогда не думал,
>>что очистить поток ввода - это такая проблема. А виндовая функция
>>fflush мне все же нравится. По моему, возможно сделать и так:
>>
>>
>>void fflush_stdin( void )
>>{
>> while( не_конец_файла_стдин )
>> {
>> fgetc( stdin );
>> }
>>}
>>Я опробую этот код при первой же возможности, но хотелось бы
>>услышать ваше мнение
>
>
>Этот цикл никогда не закончится (конечно если поток не перенаправлен в файл),
>т.к. в stdin нет EOF (End Of File)
Теория
=====
Мы должны различать 2 типа настройки терминалов:
1) "обычный", или буферизированный (canonical), когда данные передаются в пользовательскую программу в следующих случаях:
а) В буфере появилось: новая строка (NL), EOF или конец строки (EOL). Кстати EOF в DOS - это Ctrl+Z, а в Unix - Ctrl+D (ВАЖНО что бы они были первыми в строке). Если EOF произошел и мы еще собираемся использванть stdin, то надо вызвать clearerr
б) Буфер заполнился полностью и у нас нет больше места, а NL/EOF/EOL все нет. В этом случае поведение системы зависит от termio c_iflag. Подробнее смотри в man termios
2) "сырой" (noncanonical), когда например буферизация убрана, и данные передаются нам для обработки сразу (см termios).
Ответ
====
Исходя из вышеизложенного, на "ОБЫЧНОМ" терминале: Нет, такая очистка буфера работать не будет.
Т.е. мы могли бы перейти в "сырой" режим (termios флаги и tcsetattr), но тогда нам самим бы пришлось разбирать ввод, т.е. делать кучу работы, которую для нас (scanf) уже кто-то сделал. И зачем?
Удачи
--- sas