Функция printf и форматы вывода

Шаблон записи:

#include <cstdio>

int printf (const char format,   . . .) ;

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

Строка format может содержать элементы двух видов. К первому относятся симво­лы, подлежащие выводу на экран. Ко второму виду — спецификаторы формата, опре­деляющие способ представления аргументов на экране. Спецификаторы формата на­чинаются со знака процента, за которым следует код формата. Количество аргументов должно точно совпадать с количеством спецификаторов формата, причем их порядок следования должен быть одинаковым. Например, следующий вызов функции printf() выведет на экран строку “Привет f 10 всем!”.

printf(“Привет %с %d %s”,’f,  10, “всем!”);

Если количество аргументов функции printf() меньше количества спецификато­ров формата, вывод будет неопределенным. Если число аргументов больше числа спе­цификаторов формата, лишние аргументы игнорируются.

Спецификаторы формата перечислены в таблице

 

Таблица   Спецификаторы формата функции printf()
Код Формат
%c Символ
%d Десятичное целое число со знаком
%i Десятичное целое число со знаком
%e Научный формат (строчная буква е)
Научный формат (прописная буква Е)
%f Десятичное число с плавающей точкой
%g В зависимости от того, какой формат короче, применяется либо %e, либо %f
%G В зависимости от того, какой формат короче, применяется либо %E, либо %f
%o Восьмеричное число без знака
%s Строка символов
%u Десятичное целое число без знака
%x Шестнадцатеричное число без знака (строчные буквы)
%X Шестнадцатеричное число без знака (прописные буквы)
Указатель
%n Указатель на целочисленную переменную. Спецификатор вызывает присвоение этой це-
лочисленной переменной количества символов, выведенных перед ним
%% Знак %

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

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

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

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

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

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

Для вывода значений переменных типа short int и long int функция printf() ис­пользует два модификатора, которые можно применять к спецификаторам d, i, о, u и х. Модификатор l (буква “эль”) позволяет выводить значения типа long int. Например, спецификатор %ld означает, что на экран будет выведено значение типа long int. Для вывода значения типа short int используется модификатор h. Например, спецификатор %hu означает, что на экран будет выведено значение типа short unsigned int.

Начиная с 1995 года компиляторы поддерживают работу с расширенными симво­лами. Для этого к спецификатору с применяется модификатор l. В этом случае он за­дает расширенный символ. Аналогично, если модификатор l стоит перед специфика­тором s, на экран выводится строка расширенных символов.

Модификатор l можно использовать как префикс перед спецификаторами  e, f и g. Он означает, что на экран выводится значение типа long double.

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

#include <stdio.h>

 

int main(void)

{

int count;

 

printf(“Это%n проверка\n”,  &count);

printf(“%d”, count);

 

return 0;

}

Эта программа выведет на экран строку “Это проверка” и число 3.

Функция printf() имеет еще два модификатора: * и #.

Модификатор #, стоящий перед спецификаторами g, G, f, E или e, гарантирует, что число будет содержать десятичную точку, даже если оно не имеет дробной части. Если этот модификатор стоит перед спецификаторами x или X, шестнадцатеричные числа выводятся с префиксом 0x. Если же символ # будет указан перед спецификатором o, число будет дополнено ведущими нулями. К другим спецификаторам модификатор # применять нельзя.

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