Содержание | Глава 13

Функция printf

#include <stdio.h>
int printf(const char *format, ...);

Функция printf() записывает в стандартный поток stdout значения аргументов из заданного списка аргументов в соответствии со строкой форматирования, адресуемой параметром format.

В версии C99 к параметру format применен квалификатор restrict.

Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран. Элементы второго типа содержат спецификации формата, определяющие способ отображения аргументов. Спецификация формата начинается символом процента, за которым следует код формата. Количество аргументов должно в точности совпадать с количеством спецификаций формата, причем соответствие устанавливается в порядке их следования. Например, при вызове следующей функции printf() на экране будет отображено

"Нi c 10 there!"
printf("Hi %c %d %s", 'c', 10, "there!"); 

Если заданных аргументов меньше, чем спецификаций формата, результат не определен. Если аргументов больше, чем спецификаций формата, оставшиеся аргументы отбрасываются. Спецификаторы формата перечислены в таблице 13.2.

Функция printf() возвращает число реально выведенных символов. Если функция возвратит отрицательное значение, то это будет свидетельствовать о наличии ошибки.

На спецификации формата могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между знаком % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной минимальной ширины. Если длина выводимого значения (строки или числа) больше этого минимума, оно будет выведено полностью несмотря на превышение минимума. По умолчанию в качестве заполнителя используется пробел. Для заполнения нулями перед спецификацией ширины поля нужно поместить 0. Например, спецификация формата %05d дополнит нулями выводимое число, в котором менее пяти цифр, чтобы общая длина равнялась 5 символам.

Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить модификатор точности, поставьте за спецификацией ширины поля десятичную точку, а после нее — требуемое значение точности. Для форматов a, A, e, E, f и F модификатор точности определяет число выводимых десятичных знаков. Например, спецификация формата %10.4f обеспечит вывод числа с четырьмя знаками после запятой в поле шириной не меньше десяти символов. Если модификатор точности применяется к коду формата g или G, то он определяет максимальное число выводимых значащих цифр. Применительно к целым, модификатор точности задает минимальное количество выводимых цифр. При необходимости перед числом будут добавлены нули.

Если модификатор точности применяется к строкам, число, следующее за точкой, задает максимальную длину поля. Например, спецификация формата %5.7s выведет строку длиной не менее пяти, но не более семи символов. Если выводимая строка окажется длиннее максимальной длины поля, конечные символы будут отсечены.

По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак "минус" сразу после знака %. Например, спецификация формата %-10.2f обеспечит выравнивание вещественного числа с двумя десятичными знаками в 10-символьном поле по левому краю.

Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые. Эти модификаторы могут применяться к спецификаторам типа d, i, о, u, x и X. Модификатор l уведомляет функцию printf() о длинном типе значения. Например, спецификация %ld означает, что выводится длинное целое число. Модификатор h сообщает функции printf(), что нужно вывести число короткого целого типа. Следовательно, строка %hu означает, что выводимое данное имеет тип short unsigned int.

Таблица 13.2. Спецификаторы формата функции printf()
КодФормат
%aВыводит шестнадцатеричное число в форме 0xh.hhhhp+d (только C99)
%AВыводит шестнадцатеричное число в форме 0Xh.hhhhP+d (только C99)
Символ
%dДесятичное целое число со знаком
%iДесятичное целое число со знаком
%eЭкспоненциальное представление числа (в виде мантиссы и порядка) (e на нижнем регистре)
%EЭкспоненциальное представление числа (в виде мантиссы и порядка) (E на верхнем регистре)
%fДесятичное число с плавающей точкой
%FДесятичное число с плавающей точкой (только C99; если применяется к бесконечности или к нечисловому значению, то выдает надписи INF, INFINITY или NAN на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре.)
%gИспользует более короткий из форматов %e или %f
%GИспользует более короткий из форматов %E или %F
%oВосьмеричное число без знака
%sСимвольная строка
%uДесятичное целое число без знака
%xШестнадцатеричное без знака (строчные буквы)
%XШестнадцатеричное без знака (прописные буквы)
%pВыводит указатель
%nСоответствующий аргумент должен быть указателем на целое число. (Этот спецификатор указывает, что в целочисленной переменной, на которую указывает ассоциированный с данным спецификатором указатель, будет храниться число символов, выведенных к моменту обработки спецификации %n.)
%%Выводит знак процента

При использовании современного компилятора, поддерживающего добавленные в 1995 году средства работы с двухбайтовыми символами, можно к спецификации с применить модификатор l, чтобы указать на использование двухбайтовых символов. Модификатор l можно также использовать с командой формата s для вывода строки двухбайтовых символов.

Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел a, A, e, E, f, F, g и G. В этом случае он уведомит о выводе значения типа long double.

Команда n сохраняет в целой переменной, указатель на которую задан в списке аргументов, число символов, которые были записаныв поток вывода к моменту обнаружения спецификатора n. Например, следующий фрагмент программы после строки

"Это тест"
выведет число 8.
int i;

printf("Это тест%n", &i);
printf("%d", i); 

Чтобы обозначить, что соответствующий аргумент указывает на длинное целое, к спецификации n можно применить модификатор l. Для указания на короткое целое примените к спецификации n модификатор h.

Символ # при использовании с некоторыми кодами формата функции printf() приобретает специальное значение. Поставленный перед кодами a, A, g, G, f, e и E, он гарантирует наличие десятичной точки даже в случае отсутствия десятичных цифр. Если поставить символ # перед кодами формата x и X, то шестнадцатеричное число будет выведено с префиксом 0x. Если же его поставить перед кодами формата o и O, то восьмеричное число будет выведено с префиксом 0. Символ # нельзя применять ни к каким другим спецификациям формата.

Спецификации минимальной ширины поля и точности могут задаваться не константами, а аргументами функции printf(). Для этого в строке форматирования используется символ "звездочка" (*). При сканировании строки форматирования функции printf() каждый символ * будет сопоставляться с соответствующими аргументами в порядке их следования.

Модификаторы формата функции printf(), добавленные стандартом C99

В версии C99 для использования в функции printf() добавлены модификаторы формата hh, ll, j, z и t. Модификатор hh можно применять к спецификаторам преобразования d, i, o, u, x, X и n. Он означает, что соответствующий аргумент является значением типа signed char или unsigned char, а в случае спецификации n — указателем на переменную типа signed char. Модификатор ll также можно применять к спецификаторам преобразования d, i, о, u, x, X и n. Он означает, что соответствующий аргумент является значением типа signed long long int или unsigned long long int, а в случае спецификатора n — указателем на переменную типа long long int. Версия C99 также позволяет применять модификатор l к спецификаторам преобразования чисел с плавающей точкой a, A, e, E, f, F, g, и G, но это не дает никакого эффекта.

Применение модификатора формата j к спецификаторам преобразования d, i, с, u, x, X и n устанавливает для соответствующего аргумента тип intmax_t или uintmax_t. Эти типы объявлены в заголовке <stdint.h> и служат для хранения целых самой большой разрядности.

Применение к спецификаторам преобразования d, i, o, u, x, X и n модификатора формата z устанавливает для соответствующего аргумента тип size_t. Этот тип объявлен в заголовке <stddef.h> и служит для хранения результата выполнения оператора sizeof.

Применение к спецификаторам преобразования d, i, o, u, x, X и n модификатора формата t устанавливает для соответствующего аргумента тип ptrdiff_t. Этот тип объявлен в заголовке <stddef.h> и служит для хранения значения разности между двумя указателями.

Пример

Данная программа выводит то, что указано в комментариях.

#include <stdio.h>

int main(void)
{
  /* Этот фрагмент печатает строку "это тест"
     которая выравнивается по левому краю поля шириной в 20 символов.
  */
  printf("%-20s", "это тест");

  /* Этот фрагмент печатает в поле шириной в 10 символов число
     с плавающей точкой с тремя десятичными разрядами после запятой.
     В результате получится "    12.235".
  */
  printf("%10.3f", 12.234657);

  return 0;
}

Зависимые функции

scanf() fprintf()
Содержание | Глава 13