netlib.narod.ru | < Назад | Оглавление | Далее > |
Функция printf переводит внутренние значения в текст.
int printf(char *format, arg1, arg2, ...)
В предыдущих главах мы использовали printf неформально. Здесь мы покажем наиболее типичные случаи применения этой функции; полное ее описание дано в приложении В.
Функция printf преобразует, форматирует и печатает свои аргументы в стандартном выводе под управлением формата. Возвращает она количество напечатанных символов.
Форматная строка содержит два вида объектов: обычные символы, которые напрямую копируются в выходной поток, и спецификации преобразования, каждая из которых вызывает преобразование и печать очередного аргумента printf. Любая спецификация преобразования начинается знаком % и заканчивается символом-спецификатором. Между % и символом-спецификатором могут быть расположены (в указанном ниже порядке) следующие элементы:
Символы-спецификаторы перечислены в таблице 7.1. Если за % не помещен символ-спецификатор, поведение функции printf будет не определено.
Таблица 7.1. Основные преобразования printf
Символ | Тип аргумента; вид печати |
d, i | int; десятичное целое |
o | int; беззнаковое восьмеричное (octal) целое (без нуля слева) |
x, X | unsigned int; беззнаковое шестнадцатиричное целое (без 0x или 0X слева), для шестнадцатиричных цифр от 10 до 15 используются символы a, b, c, d, e, f или A, B, C, D, E, F |
u | int; беззнаковое десятичное целое |
c | int; одиночный символ |
s | char *; печатает символы, пока не встретится символ \0, или количество символов, заданное точностью |
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 *; указатель (представление зависит от реализации) |
% | Аргумент не преобразуется; печатается знак % |
Ширину и точность можно задавать с помощью знака *; значение ширины (или точности) в этом случае берется из следующего аргумента, который должен быть типа int. Например, чтобы напечатать не более max символов из строки s, годится следующая запись:
printf("%.*s", max, s);
Большая часть форматных преобразований была продемонстрирована в предыдущих главах. Исключение составляет задание точности для строк. Далее приводится перечень спецификаций и показывается их влияние на печать строки «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 |
Напишите программу, которая будет печатать разумным способом любой ввод. Как минимум она должна уметь печатать непечатаемые символы в восьмеричном или шестнадцатеричном виде (в форме, принятой на вашей машине), обрывая длинные текстовые строки. |
netlib.narod.ru | < Назад | Оглавление | Далее > |