Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Спецификаторы в си printf

printf

Функция printf() записывает в stdout аргументы из списка arg-list под управлением строки, на которую указывает аргумент format.

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

printf («Hi %с %d %s», ‘с’, 10, «there!»);

приведет к выводу «Hi с 10 there!».

Таблица: Команды форматирования для printf()

КодФормат
Символ типа char
%dДесятичное число целого типа со знаком
%iДесятичное число целого типа со знаком
Научная нотация (е нижнего регистра)
Научная нотация (Е верхнего регистра)
%fДесятичное число с плавающей точкой
%gИспользует код %е или %f — тот из них, который короче (при использовании %g используется е нижнего регистра)
%GИспользует код %Е или %f — тот из них, который короче (при использовании %G используется Е верхнего регистра)
Восьмеричное целое число без знака
%sСтрока символов
%uДесятичное число целого типа без знака
Шестнадцатиричное целое число без знака (буквы нижнего регистра)
Шестнадцатиричное целое число без знака (буквы верхнего регистра)
Выводит на экран значение указателя
%nАссоциированный аргумент — это указатель на переменную целого типа, в которую помещено количество символов, записанных на данный момент
%%Выводит символ %

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

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

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

Результат использования модификатора точности зависит от типа модифицируемой команды форматирования. Чтобы использовать модификатор точности, надо поместить десятичную точку и точность вслед за ней после количества выводимых десятичных знаков. Например, %10.4f озна­чает вывод числа шириной минимум 10 символов с четырьмя знаками после точки. Однако при использовании совместно со спецификаторами g или G модификатор точности задает максималь­ное количество отображаемых значащих цифр.

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

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

По умолчанию вывод производится с выравниванием вправо. Это значит, что если ширина поля больше, чем выводимые данные, то данные будут размещены на правом краю поля. Можно задать режим выравнивания влево, вставив знак минус сразу после знака процент. Например, %-10.2f прижмет влево в десятизнаковом поле число с плавающей точкой с двумя знаками после запятой.

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

Хоть это и не оговорено в стандарте (да это и не нужно), модификатор l может также предше­ствовать спецификаторам типа с плавающей точкой е, Е, f, g и G, указывая, что далее следует переменная double. L используется для указания long double.

Спецификатор n помещает количество выведенных до сих пор символов в переменную целого типа, на которую указывает аргумент, соответствующий спецификатору. Например, следующий фрагмент кода выводит число 15 после строки «this is a test».

int i;
printf («this is a test %n», &i);
printf(«%d», i);

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

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

Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

printf – вывод форматированной строки в стандартный поток вывода.

#include
int printf (const char *format, . );

format – указатель на строку c описанием формата.

При успешном завершении вывода возвращается количество выведенных символов.
При шибке возвращается отрицательное число.

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

Правила задаются набором трех типов директив:
1. Обычные символы (кроме ‘%’ и »), которые выводятся без изменения;
2. Спецификаторы формата;
3. Специальные сиволы.

Каждый спецификатор формата начинается с символа ‘%’ и имеет следующий формат:

Спецификатор формата может иметь 0 или более [флагов], которые могут принемать значенияуказанные в таблице 1.

Таблица 1.

ФлагНазначение флага
— (дефис)Результат преобразования выравнивается по левому краю (по умолчанию — по правому краю)
+Перед положительными числами выводится знак ‘+’, а перед отрицательыыми — знак ‘-‘ (по умолчанию выводится только знак ‘-‘ перед отрицательыми числами)
‘ ‘ (пробел)Если не указан модификатор ‘+’, то перед положительными числами, на месте знака числа, будет выводиться пробел.
#Использовать альтернативную форму представления выводимого числа. При выводе чисел в шестнадцатеричном формате (преобразователь ‘х’ или ‘Х’) перед числом будет указываться 0х или 0Х соответственно. При выводе чисел в восьмеричном формате (преобразователь ‘о’)перед числом будет указываться 0. При выводе чисел с плавующей точкой (преобразователи e, E, f, g и G) всегда будет содержаться десятичная точка (по умолчанию десятичная точка выводится только при ненулевой дробной части). При использовании преобразователей g и G хвостовые нули не будут удаляться (по умолчанию удаляются).
Если не указан флаг ‘-‘, то слева от выводимого числа будут выведены символы ‘0’ для подгона числа к указанной ширене. Если для преобразователей d, i, o, x или X указана точность, то флаг 0 игнорируется.

Спецификатор [флаги] можно не указывать.

Спецификатор [ширина] задаёт минимальный размер выводимого числа в символах. Если количество символов в выводимом числе меньше указанной минимальной ширины, то недостоющее количество символов заполняется нулями или пробелами слева или справа в зависимости от указанных флагов. Ширина указывается либо целым числом, либо символом * с последующим указанием имени переменной типа int, содержащей значение ширины, перед аргументом к которому он относится. Если аргумент имеет отрицательное значение, то он эквивалентен соответствующему положительному значению с флагом «-«.

Спецификатор [ширина] можно не указывать.

Действия спецификатора [точность] зависит от типа выводимого числа:

— Для типов d, i, o, u, x, X определяет минимальное число выводимых цифр. Если количество выводимых цифр в числе меньше, чем указано в спецификаторе [точность], то выводимое число будет дополнено нулями слева. Например, если при выводе числа 126 указать точность 4, то на экран будет выведено число 0126

— Для типов a, A, e, E, f, F определяет количество выводимых цифр после запятой. Если в выводимом числе количество значимых цифр после запятой меньше указанной точности, то недостающие символы выводятся нулями справа от числа. Если больше, то лишние цифры не выводятся. Например, если при выводе числа 126.345 указать точность 2, будет выведено на экран число 126.34, а если указать точность 5, то на экран будет выведено число 126.34500.

— Для типов g и G определяет максимальное выводимое число цифр. Например, если при выводе числа 126.345 указать точность 4, будет выведено на экран число 126.3. Если при выводе числа 1242679.23 указать точность 3, будет выведено на экран число 1.24е+06.

Точность указывается в виде символа точка, за которым следует десятичное число или символ «*», с последующим указанием имени переменной типа int, содержащей значение точности, перед аргументом к которому он относится.

Спецификатор [точность] можно не указывать.

Спецификатор [модификаторы] определяет размер выводимых данных (char, short, long, longlong). Спецификаторы используются для вывода чисел типа: char, short int, long int, long long int, long double или для явного преобразования выводимых данных. Например, если имеется переменная типа int, а необходимо вывести ее как short int. Доступные модификаторы приведены в таблице 2.

Таблица 2.

МодификаторНазначение модификатора
hДля вывода числа типа short int или unsigned short int. Или для явного преобразования при выводе целочисленного числа к типу short int или unsigned short int. Используется совместно с типами преобразования:d, i, o, u, x и X, n.
hhДля вывода числа типа char или unsigned char. Или для явного преобразования при выводе целочисленного числа к типу char или unsigned char. Используется совместно с типами преобразования:d, i, o, u, x и X, n.
lДля вывода числа типа long int или unsigned long int. Или для явного преобразования при выводе целочисленного числа к типу long int или unsigned long int. Используется совместно с типами преобразования:d, i, o, u, x и X, n.
llДля вывода числа типа long long int или unsigned long long int. Или для явного преобразования при выводе целочисленного числа к типу long long int или unsigned long long int. Используется совместно с типами преобразования:d, i, o, u, x и X, n.
LДля вывода числа типа long double. Или для явного преобразования при выводе числа c плавающей точкой к типу long double. Используется совместно с типами преобразования:e, E, f, g и G.

Спецификатор [тип преобразования] определяет как надо итерпритировать и выводить число, например как знаковое целочисленное в десятичном виде, или беззнаковое целочисленное в шестнадцатеричном, или как число с плавающей точкой и так далее. Перечень доступных преобразований и их описание указано в таблице 3.

Таблица 3.

Тип преобразованияНазначение преобразования
d,iВывод целого числа со знаком в десятичной систем счисления. По умолчанию выводится число размером sizeof( int ), с правым выравниванием, указанием знака только для отрицательных чисел.
uВывод целого числа без знака в десятичной систем счисления. По умолчанию выводится число размером sizeof( int ), с правым выравниванием.
oВывод целого числа без знака в восьмеричной систем счисления. По умолчанию выводится число размером sizeof( int ), с правым выравниванием.
x, XВывод целого числа без знака в шестнадцетеричной систем счисления. Причем для преобразования x используются символы abcdef, а для X — символы ABCDEF. По умолчанию выводится число размером sizeof( int ), с правым выравниванием.
f, FВывод числа с плавающей точкой в виде [-]dddd.ddd. По умолчанию выводится число с точностью 6, если число по модулю меньше единицы, то пред десятично точкой выводится ноль, знак указывается только для отрицательных чисел, с правым выравниванием. Размер по умолчанию sizeof( double ).
e, EВывод числа с плавающей точкой в экспоненциальной форме записи, в виде [-]dddd.ddde±dd, причем для модификатора e используется символ e, а для модификатора E — символ E. По умолчанию выводится число с точностью 6, если число по модулю меньше еденицы, то пред десятично точкой выводится ноль, знак указывается только для отрицательных чисел, с правым выравниванием. После символа «e» (или «E») всегда выводится две цифры (они равны 0, если аргумент равен 0).
g, GВывод числа с плавающей точкой в форме зависищей от величины цисла. Например число 345.26 будет выведено как 345.26, а число 1344527.434 как 1.34453e+06. По умолчанию выводится 6 значащих цифр числа с округлением, если число по модулю меньше еденицы, то пред десятично точкой выводится ноль, знак указывается только для отрицательных чисел, с правым выравниванием.
a, AВывод числа с плавающей точкой в шестнадцатеричном фомрате, в экспоненциальной форме записи. Например число 137.434 будет выведено как 0x1.12de353f7ced9p+7. Экспонента обозначается символом p. Для модификатора a используется символ p, а для модификатора A — символ P.По умолчанию знак указывается только для отрицательных чисел, выравнивание — правое.
сВывод символа, соответстветсвующего числу указанному в аргументе функции. По умолчанию число приводится к типу unsigned char.
sВывод строки, на которую ссылается указатель в аргументе функции printf. Строка выводится пока не будет встречен символ конец строки (/0). По умолчанию строка должна обозначаться как char*. Если указан модификатор l, то строка интерпитируется как wchar_t*. Для функции wprintf строка по умолчанию обрабатывается как wchar_t*.
SАналогичен преобразованию s с модификатором l (ls).
pВывод указателя. Результат ввода зависит от архитектуры и используемого компилятрора. Например, на 16 битной платформе MS-DOS вывод будет иметь вид типа FFAB:1402, а на 32-битной платформе с плоской адресацией — 00FC0120.
nЗапись по адресу, указанному в аргументе функции, количества выведенных символов функцией printf до встречи преобразователя %n. При обработке преобразователя %n никакого вывода символов не производится.

Для форматирования вывода в функции printf предусмотрен набор специальных симовлов. Перечень специальных символов приведен в таблице 4.

printf()

Вот прототип функции printf() :

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

Управляющая_строка [1] состоит из элементов двух видов. Первый из них — это символы, которые предстоит вывести на экран; второй — это спецификаторы преобразования [2] , которые определяют способ вывода стоящих за ними аргументов. Каждый такой спецификатор начинается со знака процента, за которым следует код формата. Аргументов должно быть ровно столько, сколько и спецификаторов, причем спецификаторы преобразования и аргументы должны попарно соответствовать друг другу в направлении слева направо. Например, в результате такого вызова printf()

В этом примере первому спецификатору преобразования ( %c ), соответствует символ ‘C’, а второму ( %s ), — строка «и к тому же очень сильно!».

В функции printf() , как видно из табл. 8.2, имеется широкий набор спецификаторов преобразования.

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

Вывод символов

Для вывода отдельного символа используйте %с . В результате соответствующий аргумент будет выведен на экран без изменения.

Для вывода строки используйте %s .

Вывод чисел

Числа в десятичном формате со знаком отображаются с помощью спецификатора преобразования %d или %i . Эти спецификаторы преобразования эквивалентны; оба поддерживаются в силу сложившихся привычек программистов, например, из-за желания поддерживать те же спецификаторы, которые применяются в функции scanf() .

Для вывода целого значения без знака используйте %u .

Спецификатор преобразования %f дает возможность выводить числа в формате с плавающей точкой. Соответствующий аргумент должен иметь тип double .

Спецификаторы преобразования %e и %E в функции printf() позволяют отображать аргумент типа double в экспоненциальном формате. В общем виде числа в таком формате выглядят следующим образом:

Чтобы отобразить букву E в верхнем регистре, используйте спецификатор преобразования %E ; в противном случае используйте спецификатор преобразования %e .

Спецификатор преобразования %g или %G указывает, что функции printf() необходимо выбрать один из спецификаторов: %f или %e . В результате printf() выберет тот спецификатор преобразования, который позволяет сделать самый короткий вывод. Если нужно, чтобы при выборе экспоненциального формата буква E отображалась на верхнем регистре, используйте спецификатор преобразования %G ; в противном случае используйте спецификатор преобразования %g .

Применение спецификатора преобразования %g показано в следующей программе:

В результате выполнения получится следующее:

Целые числа без знака можно выводить в восьмеричном или шестнадцатеричном формате, используя спецификатор преобразования %o или %x . Так как в шестнадцатеричной системе для представления чисел от 10 до 15 используются буквы от А до F, то эти буквы можно выводить на верхнем или на нижнем регистре. Как показано ниже, в первом случае используется спецификатор преобразования %X , а во втором — спецификатор преобразования %x :

Вот что вывела эта программа:

Отображение адреса

Для отображения адреса используйте спецификатор преобразования %p . Этот спецификатор преобразования дает printf() указание отобразить машинный адрес в формате, совместимом с адресацией, которая используется компьютером. Следующая программа отображает адрес переменной sample :

Спецификатор преобразования %n

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

Программа отображает строку Это проверка , после которой появляется число 3 . Спецификатор преобразования %n в основном используется в программе для выполнения динамического форматирования.

Модификаторы формата

Во многих спецификаторах преобразования можно указать модификаторы [3] , которые слегка меняют их значение. Например, можно указывать минимальную ширину поля, количество десятичных разрядов и выравнивание по левому краю. Модификатор формата помещают между знаком процента и кодом формата. Об этих модификаторах сейчас и пойдет речь.

Модификаторы минимальной ширины поля

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

Вот что выводится при выполнении этой программы:

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

Модификаторы точности

Модификатор точности следует за модификатором минимальной ширины поля (если таковой имеется). Он состоит из точки и расположенного за ней целого числа. Значение этого модификатора зависит от типа данных, к которым его применяют.

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

Если модификатор точности применяется к %g или %G , то он определяет количество значащих цифр.

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

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

В следующей программе показано, как можно использовать модификатор точности:

Вот что выводится при выполнении этой программы:

Выравнивание вывода

По умолчанию весь вывод выравнивается по правому краю. То есть если ширина поля больше ширины выводимых данных, то эти данные располагаются по правому краю поля. Вывод по левому краю можно назначить принудительно, поместив знак минус прямо за % . Например, %-l0.2f означает, что число с плавающей точкой и с двумя десятичными разрядами будет выровнено по левому краю 10-символьного поля.

В следующей программе показано, как применяется выравнивание по левому краю:

И вот что получилось:

Обработка данных других типов

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

Модификаторы l и h можно также применить к спецификатору n . Это делается с той целью, чтобы показать — соответствующий аргумент является указателем соответственно на длинное ( long ) или короткое ( short ) целое.

Если компилятор поддерживает обработку символов в расширенном 16-битном алфавите, добавленную Поправкой 1 от 1995 года (1995 Amendment 1), то для указания символа в расширенном 16-битном алфавите вы можете применять модификатор 1 для спецификатора преобразования c . Кроме того, для указания строки из символов в расширенном 16-битном алфавите можно применять модификатор 1 для спецификатора преобразования s .

Модификатор L может находиться перед спецификаторами преобразования с плавающей точкой e , f и g , и указывать этим, что преобразуется значение long double .

В Стандарте С99 вводится два новых модификатора формата: hh и ll . Модификатор hh можно применять для спецификаторов преобразования d , i , o , u , x или n . Он показывает, что соответствующий аргумент является значением signed или unsigned char или, в случае n , указателем на переменную signed char . Модификатор ll также можно применять для спецификаторов преобразования d , i , o , u , x или n . Он показывает, что соответствующий аргумент является значением signed или unsigned long long int или, в случае n , указателем на long long int . В С99 также разрешается применять l для спецификаторов преобразования с плавающей точкой a , е , f и g ; впрочем, это не дает никакого результата.

На заметкуВ составе С99 имеются некоторые дополнительные модификаторы типа для функции printf() ; о них рассказывается в части II.

Модификатор * и #

Для некоторых из своих спецификаторов преобразования функция printf() поддерживает два дополнительных модификатора: * и # .

Непосредственное расположение # перед спецификаторами преобразования g , G , f , Е или e означает, что при выводе обязательно появится десятичная точка — даже если десятичных цифр нет. Если вы поставите # непосредственно перед x или X , то шестнадцатеричное число будет выведено с префиксом 0x . Если # будет непосредственно предшествовать спецификатору преобразования o , число будет выведено с ведущим нулем. К любым другим спецификаторам преобразования модификатор # применять нельзя. (В С99 модификатор # можно применять по отношению к преобразованию %а ; это значит, что обязательно будет выведена десятичная точка.)

Модификаторы минимальной ширины поля и точности можно передавать функции printf() не как константы, а как аргументы. Для этого в качестве заполнителя используйте звездочку ( * ). При сканировании строки формата функция printf() будет каждой звездочке * из этой строки ставить в соответствие очередной аргумент, причем в том порядке, в каком расположены аргументы. Например, при выполнении оператора, показанного на рис. 8.1, минимальная ширина поля будет равна 10 символам, точность — 4, а отображаться будет число 123.3 .

В следующей программе показано применение обоих модификаторов # и * :

Рис. 8.1. Обратите внимание на то, каким образом звездочке (*) ставится в соответствие определенное значение

[1] Часто называется просто форматной строкой , форматным стрингом или форматом .

[2] Называются также спецификациями формата .

[3] Называются также спецификаторами .

Функция printf

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

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

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

Если заданных аргументов меньше, чем спецификаций формата, результат не определен. Если аргументов больше, чем спецификаций формата, оставшиеся аргументы отбрасываются. Спецификаторы формата перечислены в таблице 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 .

Читать еще:  Функции в си шарп
Ссылка на основную публикацию
Adblock
detector