Основы программирования в Linux
<b>#include <stdio.h></b><b>int printf(const char *format, ...);</b><b>int sprintf(char *s, const char *format, ...);</b><b>int fprintf(FILE * stream, const char *format, ...);</b>Функция
выводит результат в стандартный вывод. Функцияprintfвыводит результат в заданный файловый потокfprintf. Функцияstreamзаписывает результат и завершающий нулевой символ в строкуsprintf, передаваемую как параметр. Эта строка должна быть достаточно длинной, чтобы вместить весь вывод функции.sУ семейства
есть и другие члены, обрабатывающие свои аргументы различными способами. См. подробную информацию на страницах интерактивного руководства.printfОбычные символы передаются в вывод без изменений. Спецификаторы преобразований заставляют функцию
выбирать и форматировать дополнительные аргументы, передаваемые как параметры. Спецификаторы всегда начинаются с символаprintf. Далее приведен простой пример:%printf("Some numbers: %d, %d, and &d\n", 1, 2, 3);Он порождает в стандартном выводе следующую строку.
Some numbers: 1, 2, and 3Для вывода символа
следует применять последовательность%, чтобы не путать его со спецификатором преобразования.%%Далее перечислены наиболее часто применяемые спецификаторы преобразований:
□
,%d— выводить целое как десятичное число;%i□
,%о— выводить целое как восьмеричное, шестнадцатеричное число;%x□
— выводить символ;%с□
— выводить строку;%s□
— выводить число с плавающей точкой (одинарной точности);%f□
— выводить число с двойной точностью в формате фиксированной длины;%e□
— выводить число двойной точности в общем формате.%gОчень важно, чтобы число и тип аргументов, передаваемых функции
, соответствовали спецификаторам преобразования в строкеprintf. Необязательный спецификатор размера применяется для обозначения типа целочисленных аргументов.formatОн может быть равен
, например,hдля обозначения типа%hd(короткие целые), илиshort int, например,lдля обозначения типа%ld(длинные целые). Некоторые компиляторы могут проверять эти установкиlong int, но они ненадежны. Если вы применяете компилятор GNU gcc, можно вставить для этого в команду компиляции опциюprintf.-WformatДалее приведен еще один пример:
char initial = 'А';char *surname = "Matthew";double age = 13.5;printf("Hello Mr %c %s, aged %g\n", initial, surname, age);Будет выводиться следующая информация:
Hello Mr A Matthew, aged 13.5Вы можете добиться большего при выводе элементов с помощью спецификаторов полей. Они расширяют возможности спецификаторов преобразований, управляя расположением элементов при выводе. Обычно задается количество десятичных разрядов для числа с плавающей точкой или величина пробельных отступов, обрамляющих строку.
Спецификаторы полей задаются в виде чисел, следующих в спецификаторах преобразований непосредственно за знаком
. В табл. 3.5 приведены дополнительные примеры использования спецификаторов преобразований и результирующий вывод. Для большей ясности мы применяем знак вертикальной черты, чтобы показать границы вывода.%Таблица 3.5
Формат Аргумент Вывод %10s"Hello"| Hello|%-10s"Hello"|Hello |%10d1234| 1234|%-10d1234|1234 |%010d1234|0000001234|%10.4f12.34| 12.3400|%*s10, "Hello"| Hello|Все приведенные примеры выводятся в поле шириной 10 символов. Обратите внимание на то, что отрицательная ширина поля означает выравнивание элемента по левому краю в пределах поля. Переменная ширина поля обозначается символом "звездочка" (
). В этом случае следующий аргумент применяется для задания ширины. Ведущий ноль указывает на вывод элемента с ведущими нулями. В соответствии со стандартом POSIX функция*не обрезает поля; наоборот она расширяет поле, чтобы вместить в него аргумент. Например, если вы попытаетесь вывести строку большей длины, чем заданное поле, ширина поля будет увеличена (табл. 3.6).printfТаблица 3.6
Формат Аргумент Вывод %10s"HelloTherePeeps"|HelloTherePeeps|