Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
130 Глава 4
ФУНКЦИЯ printf()
Инструкции, которые вы даете функции printf(), запрашивая у нее вывод пере менной, зависят от типа этой переменной. Например, ранее мы применяли форму записи %d при выводе целого числа и %с при выводе символа. Эти обозначения называются спецификаторами преобразования, поскольку они определяют, каким образом данные преобразуются в отображаемую форму. Мы приведем список спецификаторов преобразования, которые стандарт ANSI С предоставляет для функции printf(), и затем покажем, как использовать наиболее общие из них. В табл. 4.3 перечислены спецификаторы преобразования и показан вывод, к которому они приводят.
Таблица 4.3. Спецификаторы преобразования и результирующий вывод
Использование функции printf()
В листинге 4.6 представлена программа, в которой применяются некоторые спецификаторы преобразования.
Символьные строки и форматированный ввод-вывод 131
Листинг 4.6. Программа printout, с
Вывод программы выглядит вполне ожидаемо:
7 участников соревнований съели 12.750000 пирожков с вишнями.
Значение pi равно 3.141593.
До свидания! Ваше искусство слишком дорого обходится,
$15600
Формат использования функции printf() имеет вид:
printf(управляющая-строка, элемент1, элемент2, ...);
Здесь элемент 1, эмемент2 и т.д. — это элементы, которые нужно вывести. Ими могут быть переменные, константы или даже выражения, которые вычисляются до того, как значение будет выведено. Далее, управляющая-строка представляет собой символьную строку, описывающую способ вывода элементов. Как упоминалось в главе 3, управляющая строка должна содержать спецификатор преобразования для каждого выводимого элемента. Например, рассмотрим следующий оператор:
printf("%d участников соревнований съели %f пирожков с вишнями.\n", number, pies);
В этом операторе управляющая-строка — это фраза, заключенная в двойные кавычки. Она содержит два спецификатора преобразования, соответствующие number и pies — двум выводимым элементам. На рис. 4.6 показан другой пример применения оператора printf().
Рис. 4.6. Аргументы функции printf()
Вот еще одна строка из примера:
printf("Значение pi равно %f.\n", PI);
На этот раз список элементов состоит только из одного элемента — символической константы PI.
132 Глава 4
Как можно видеть на рис. 4.7, управляющая строка содержит два разных вида информации:
• символы, которые в действительности выводятся;
• спецификаторы преобразования.
Рис. 4.7. Структура управляющей стракн
Внимание!
Не забудьте предусмотреть по одному спецификатору преобразования для каждого элемента, следующего за управляющей строкой. Если вы не удовлетворите это основное требование, возникнут проблемы. Никогда не поступайте так:
printf("Выпало %d очков из %d.\n", scorel);
Здесь отсутствует значение для второго спецификатора %d. Результат такой небрежности зависит от системы, но в лучшем случае на экране отобразятся бессмысленные символы.
Если вы хотите вывести только фразу, то не нуждаетесь в каких-либо спецификаторах преобразования. Чтобы вывести только данные, вы можете обойтись традиционным вызовом. Оба следующих оператора из листинга 4.6 вполне приемлемы:
printf("До свидания! Ваше искусство слишком дорого мне обходится,\n"); printf("%c%d\n", 2 * cost);
Обратите внимание, что во втором операторе первый элемент в списке для вывода представляет собой символьную константу, а не переменную, тогда как второй элемент является результатом умножения. Это иллюстрирует тот факт, что функция printf() работает со значениями, будь они переменными, константами или выражениями.
Поскольку функция printf() использует символ % для идентификации спецификаторов преобразования, то возникает небольшая проблема, когда требуется вывести сам символ %. Если просто указать одиночный знак %, компилятор посчитает, что вы некорректно задали спецификатор преобразования. Выход из этой ситуации прост: достаточно указать два символа %:
рс = 2*6;
printf("Только %d%% припасов Мэри были пригодными в пищу.\n", рс);
В результате выполнения этого фрагмента программы получим следующий результат:
Только 12% припасов Мэри были пригодными в пищу.
Модификаторы спецификаторов преобразования для функции printf()
Базовый спецификатор преобразования можно изменять, вставляя модификаторы между знаком % и символом, который определяет преобразование.
Символьные строки и форматированный ввод-вывод 133
В табл. 4.4 и 4.5 перечислены символы, которые можно здесь размещать. При указании более одного модификатора они должны располагаться в том же порядке, в каком они представлены в табл. 4.4. Не все возможные комбинации допустимы. В таблице отражены дополнения стандарта С99; ваша реализация может не поддерживать все показанные варианты.
Таблица 4.4. Модификаторы функции printf()
134 Глава 4
НА ЗАМЕТКУ! Переносимость типов
Вспомните, что операция si zeof возвращает размер типа или значения в байтах. Это значение должно быть какой-либо формой целого числа, но стандарт допускает только целое значение без знака. Следовательно, им может быть unsigned int, unsigned long или даже unsigned long long. Таким образом, в случае применения функции printf() для отображения выражения sizeof можно было бы использовать спецификатор %u в одной системе, %lu — в другой и %llu — в третьей. Это значит, что нужно выяснить правильное применение в конкретной системе, и что в случае переноса в другую систему может потребоваться изменить программу.
Итак, помимо всего прочего, язык С предоставляет поддержку для обеспечения более высокой переносимости типов. Во-первых, заголовочный файл stddef.h (включаемый в результате включения заголовочного файла stdio.h) определяет, что типом sizet будет тип, используемый в системе для возвращаемого значения операции sizeof. Этот тип называется основополагающим типом. Во-вторых, в функции printf() применяется модификатор z для указания соответствующего типа при выводе. Аналогично в языке С определен тип pt rdi f f_t и модификатор t для указания основополагающего целочисленного типа со знаком, используемого системой для представления разницы между двумя адресами.
НА ЗАМЕТКУ! Преобразование аргументов типа float
Читать дальшеИнтервал:
Закладка: