Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Новое направление Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1097
от 05.09.2008, 20:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 433, Экспертов: 39
В номере:Вопросов: 1, Ответов: 1

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>


Вопрос № 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


Вы имеете возможность оценить этот выпуск рассылки.
Нам очень важно Ваше мнение!
Оценить этот выпуск рассылки >>

Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2008, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале

∙ Версия системы: 5.2 RC 1 от 03.09.2008

Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное