Символ | Тип аргумента; вид печати |
---|---|
d, i | int; десятичное целое |
o | unsigned int; беззнаковое восьмеричное ( |
x, | X unsigned int; беззнаковое шестнадцатеричное целое (без 0x или 0X слева), для 10…15 используются abcdef или ABCDEF |
u | unsigned 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 *; указатель (представление зависит от реализации) |
% | Аргумент не преобразуется; печатается знак % |
Большая часть форматных преобразований была продемонстрирована в предыдущих главах. Исключение составляет задание точности для строк. Далее приводится перечень спецификаций и показывается их влияние на печать строки "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(s); /* НЕВЕРНО, если в s есть % */
printf("%s", s); /* ВЕРНО всегда */
Функция sprintf выполняет те же преобразования, что и
int sprintf(char *string, char *format, arg1, arg2,…)
Эта функция форматирует
Упражнение 7.2. Напишите программу, которая будет печатать разумным способом любой ввод. Как минимум она должна уметь печатать неграфические символы в восьмеричном или шестнадцатеричном виде (в форме, принятой на вашей машине), обрывая длинные текстовые строки.
7.3 Списки аргументов переменной длины
Этот параграф содержит реализацию минимальной версии
Объявление стандартной функции
int printf(char *fmt, …)
Многоточие в объявлении означает, что число и типы аргументов могут изменяться. Знак многоточие может стоять только в конце списка аргументов. Наша функция
void minprintf(char *fmt, …)
поскольку она не будет выдавать число символов, как это делает