printf()

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

Описание

Записывает в стандартный поток stdout значения аргументов из заданного списка аргументов в соответствии со строкой форматирования

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

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

Копировать
printf("Hi %c %d %s", 'с', 10, "there!")

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

Код    Формат
Шестнадцатеричное целое в форме Oxh.hhhhp+d.(только С99)
Шестнадцатеричное целое в форме OXh.hhhhP+d.(только С99)
Символ
%d Десятичное целое со знаком
%i Десятичное целое со знаком
Экспоненциальное представление (строчная буква е)
Экспоненциальное представление (прописная буква Е)
%f Значение с плавающей точкой
%F Значение с плавающей точкой (только в С99; при бесконечном результате или когда значение не является числом, выводит INF, INFINITY или NAN; спецификатор %f генерирует строчные эквиваленты)
%g Использует более короткий из двух форматов: %е или %f (если %е, использует строчную букву е)
%G Использует более короткий из двух форматов: %Е или %F (если %Е, использует прописную букву Е)
%o Восьмеричное целое без знака
%s Строка символов
%u Десятичное целое без знака
Шестнадцатеричное целое без знака (строчные буквы)
Шестнадцатеричное целое без знака (прописные буквы)
Указатель
%n Соответствующий аргумент должен быть указателем на целое. Данный спецификатор сохраняет в этом целом число символов, выведенных в выходной поток к текущему моменту (до обнаружения спецификатора %n)
%% Печатает символ %

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

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

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

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

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

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

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

Модификатор l можно также поставить перед командами форматирования вещественных чисел а, А, е, Е, f, F, g и G. В этом случае он уведомит о выводе значения типа long double.

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

Копировать
int i;
printf("This is a test%n", &i);
printf("%d", i);

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

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

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

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

В версии С99 добавлено несколько модификаторов формата для использования в функции printf(): hh, l, j, z и t. Модификатор hh можно применять к спецификаторам d, i, о, и, х, X и n. Он означает, что соответствующий аргумент является значением типа signed char или unsigned char, а в случае спецификатора n — указателем на переменную типа signed char. Модификатор llтакже можно применять к спецификаторам d, i, о, и, х, X и n. Он означает, что соответствующий аргумент является значением типа signed long long int или unsigned long long int, а в случае спецификатора n — указателем на переменную типа long long int.

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

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

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

В версии С99 также разрешено применять модификатор l к спецификаторам вещественных типов а, А, е, Е, f, F, g и G, но он не работает.