Книга: Язык программирования Си. Издание 3-е, исправленное
7.2 Форматный вывод (printf)
7.2 Форматный вывод (printf)
Функция printf переводит внутренние значения в текст.
int printf(char *format, arg1, arg2, …)
В предыдущих главах мы использовали printf неформально. Здесь мы покажем наиболее типичные случаи применения этой функции: полное ее описание дано в приложении B.
Функция printf преобразует, форматирует и печатает свои аргументы в стандартном выводе под управлением формата. Возвращает она количество напечатанных символов.
Форматная строка содержит два вида объектов: обычные символы, которые напрямую копируются в выходной поток, и спецификации преобразования, каждая из которых вызывает преобразование и печать очередного аргумента printf. Любая спецификация преобразования начинается знаком % и заканчивается символом-спецификатором. Между % и символом-спецификатором могут быть расположены (в указанном ниже порядке) следующие элементы:
• Знак минус, предписывающий выравнивать преобразованный аргумент по левому краю поля.
• Число, специфицирующее минимальную ширину поля. Преобразованный аргумент будет занимать поле по крайней мере указанной ширины. При необходимости лишние позиции слева (или справа при левостороннем расположении) будут заполнены пробелами.
• Точка, отделяющая ширину поля от величины, устанавливающей точность.
• Число (точность), специфицирующее максимальное количество печатаемых символов в строке, или количество цифр после десятичной точки - для чисел с плавающей запятой, или минимальное количество цифр - для целого.
• Буква h, если печатаемое целое должно рассматриваться как short, или l (латинская буква ell), если целое должно рассматриваться как long.
Символы-спецификаторы перечислены в таблице 7.1. Если за % не помещен символ- спецификатор, поведение функции printf будет не определено. Ширину и точность можно специфицировать с помощью *; значение ширины (или точности) в этом случае берется из следующего аргумента (который должен быть типа int). Например, чтобы напечатать не более max символов из строки s, годится следующая запись:
printf("%.*s", max, s);
Таблица 7.1 Основные преобразования printf
Символ | Тип аргумента; вид печати |
---|---|
d, i | int; десятичное целое |
o | unsigned int; беззнаковое восьмеричное (octal) целое (без нуля слева) |
x, | X unsigned int; беззнаковое шестнадцатеричное целое (без 0x или 0X слева), для 10…15 используются abcdef или ABCDEF |
u | unsigned int; беззнаковое десятичное целое |
c | int; одиночный символ |
s | char *; печатает символы, расположенные до знака , или в количестве, заданном точностью |
f | double;[-]m.dddddd, где количество цифр d задается точностью (по умолчанию равно 6) |
e, E | double;[-]m.dddddde+xx или [-]m.ddddddE+xx, где количество цифр d задается точностью (по умолчанию равно 6) |
g, G | double; использует %e или %E, если порядок меньше, чем -4, или больше или равен точности; в противном случае использует %f. Завершающие нули и завершающая десятичная точка не печатаются |
p | void *; указатель (представление зависит от реализации) |
% | Аргумент не преобразуется; печатается знак % |
Большая часть форматных преобразований была продемонстрирована в предыдущих главах. Исключение составляет задание точности для строк. Далее приводится перечень спецификаций и показывается их влияние на печать строки "hello, world", состоящей из 12 символов. Поле специально обрамлено двоеточиями, чтобы была видна его протяженность.
:%s: :hello, world:
:%10s :hello, world:
:%.10s: :hello, wor:
:%-10s: :hello, world:
:%.15s: :hello, world:
:%-15s: :hello, world :
:%15.10s: : hello, wor:
:%-15.10s: :hello, wor :
Предостережение: функция printf использует свой первый аргумент, чтобы определить, сколько еще ожидается аргументов и какого они будут типа. Вы не получите правильного результата, если аргументов будет не хватать или они будут принадлежать не тому типу. Вы должны также понимать разницу в следующих двух обращениях:
printf(s); /* НЕВЕРНО, если в s есть % */
printf("%s", s); /* ВЕРНО всегда */
Функция sprintf выполняет те же преобразования, что и printf, но вывод запоминает в строке
int sprintf(char *string, char *format, arg1, arg2,…)
Эта функция форматирует arg1, arg2 и т. д. в соответствии с информацией, заданной аргументом format, как мы описывали ранее, но результат помещает не в стандартный вывод, а в string. Заметим, что строка string должна быть достаточно большой, чтобы в ней поместился результат.
Упражнение 7.2. Напишите программу, которая будет печатать разумным способом любой ввод. Как минимум она должна уметь печатать неграфические символы в восьмеричном или шестнадцатеричном виде (в форме, принятой на вашей машине), обрывая длинные текстовые строки.
- Глава 7. Ввод и вывод
- 7.4 Форматный ввод (scanf)
- B1.2. Форматный вывод
- Включение и отключение синхронного вывода
- 2. Правила вывода Армстронга
- 3. Производные правила вывода
- 1.6 Драйверы и буферы ввода-вывода
- 1.8 Ввод-вывод типичного приложения хранения данных
- Глава 6 BIOS – базовая система ввода-вывода
- Пример использования шаблона «Выводы – рекомендации»
- Выводы и практические рекомендации
- Вывод листинга программы