Вопрос № 142718: Уважаемые профессионалы. В книге Хэзфилд, Кирби "<i> Искусство программирования на языке Си. Фундаментальные алгоритмы.... </i>" на 58 стр. увидел текст ниже. Скажите, кто прав? Он или авторы следующих ресурсов : http://c-faq.com/stdio/std...
Вопрос № 142.718
Уважаемые профессионалы. В книге Хэзфилд, Кирби " Искусство программирования на языке Си. Фундаментальные алгоритмы.... " на 58 стр. увидел текст ниже. Скажите, кто прав? Он или авторы следующих ресурсов : http://c-faq.com/stdio/stdinflush.html http://c-faq.com/stdio/stdinflush2.html .
Подавление буферов ввода Ниже демонстроруется обычно применяемая методика освобождения от нежелательных символов во входном потоке:
Код:
printf("Введите в
озраст"); scanf("%d", &age); /*получение возраста*/ printf("Введите размер обуви:"); fflush(stdin); scanf("%d", &shoesize);
Почитаем, что стандарт говорит об этом фрагменте:
Код:
#include <stdio.h> int fflush(FILE*
stream);
Из раздела 7.19.5.2: "[#2] Если stream указывает на выходной поток или на модификацию потока, в котором последняя не было операцией ввода, функция fflush удаляет любые непечатаемые данные, для которых поток доставлен в хост-среду для записи в файл; в противном случае поведение неопределено".
Если вы хотите избавиться от случайных символов между обращениями к scanf, можете сделать это
следующим образом:
Код:
printf("Введите возраст:"); fflush(stdout); scanf("%d",&age); printf("Введите размер обуви:"); fflush(stdout); scanf(" %d", &shoesize); /*обратите внимание на лидирующий пробел*/
(Как
вы видите, я принял возможность продемонстрировать, что вы можете переносимо собрать ввод на той же строке, что и предыдущий вывод, разумно используя функцию fflush() )
Скажите, кто прав? Что дает этот "волшебный" пробел в его примере?
Отправлен: 31.08.2008, 05:39
Вопрос задал: Warobushek (статус: 1-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Хватов Сергей
Здравствуйте, Warobushek!
Вот описание fflush из GNU libc. Утверждается, что это поведение соответствует стандартам C89 и C99
-- Function: int fflush (FILE *STREAM) This function causes any buffered output on STREAM to be delivered to the file. If STREAM is a null pointer, then `fflush' causes buffered output on _all_ open output streams to be flushed.
This function returns `EOF' if a write error occurs, or zero otherwise.
то есть
fflush() сбрасывает буфер вывода. Про ввод - ни слова. А вот после printf() он в примере как раз нужен - без него вы приглашение вряд ли увидите.
кусочек оттуда же про scanf:
Any whitespace character (as defined by the `isspace' function; Classification of Characters) in the template causes any number of whitespace characters in the input stream to be read and discarded. The whitespace characters that are matched need not be exactly the same whitespac
e characters that appear in the template string. For example, write ` , ' in the template to recognize a comma with optional whitespace before and after.
любое количество пробелов, табуляций, CR, LF (возможно, нулевое) пропускается. %d это сам делает, так что спецификация " %d" выглядит бессмысленно.
Вообще scanf() - функция опасная, и пользоваться ей надо с осторожностью. Если уж вы ориентируетесь на построчный ввод, то лучше сначала всю строку считывать с помощью fgets(), а уже
её разбирать, например, с помощью sscanf(). И проверять результат, возвращаемый функциями
Еще по двум вашим вопросам (первый - про "уплотнённые циклы") у меня сложилось впечатление, что либо автор описывает какую-то конкретную, не самую аккуратную, реализашию языка, либо у него просто низкая квалификация
Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 31.08.2008, 10:46