CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по функциям C/C++
printf
printf
Функция Производит форматированный вывод в stdout. Синтаксис #include<stdio.h> int printf(const char *format [,argument, ...]); Файл, содержащий stdio.h прототип Описание printf получает набор аргументов, применяет к каждому соответствующую спецификацию формата из строки format, и выводит форматированные данные в stdout. Число аргументов должно соответствовать числу спецификаций формата в format. Строка формата. Строка формата, представленная в каждом вызове функций семейства ...printf, управляет тем, как каждая из функций будет преобразовывать, форматировать и печатать свои аргументы. Для формата должно быть достаточно аргументов, иначе результаты могут быть непредвиденными, и, скорее всего, неверными. Лишние аргументы (если их количество больше, чем требуется в формате) будут игнорироваться. Строка формата - это символьная строка, состоящая из двух типов объектов - просто символы и спецификации преобразования. - Простые символы переносятся в вывод без изменений. - Спецификации преобразования применяются для форматирования. Спецификации формата. Спецификации формата для функций семейства ...printf имеют следующую форму: %[флаги] [ширина] [.точность] [F|N|h|l|L] type Каждая спецификация начинается с символа процента (%). После процента следуют признаки в порядке: - необязательная последовательность [flags] символов-флагов; - необязательная спецификация [width] ширины; - необязательная спецификация [.prec] точности; - необязательный модификатор [F|N|h|l|L] входного размера; - символ типа преобразования [type]. Необязательные компоненты строки формата. Далее описаны основные правила управления форматом, включая необязательные символы, спецификации и модификации для форматной строки. -----------------T--------------------------------------------------- Символ или ¦ Как они управляют форматом спецификация ¦ -----------------+--------------------------------------------------- flags (флажки) ¦ выравнивание вывода, знак числа, десятичная ¦ точка, хвостовые нули, восьмеричные и десятичные ¦ префиксы. ¦ width (ширина) ¦ максимальное число печатаемых символов, включая ¦ пробелы и нули. ¦ precision ¦ максимальное число печатаемых символов; для целых (точность) ¦ чисел максимальное число цифр. ¦ size (размер) ¦ отвергает размер аргумента по умолчанию ¦ (N- ближний указатель, F- дальний указатель, ¦ h- короткое целое, l- длинное целое, L - long ¦ double). -----------------+--------------------------------------------------- Символы преобразования для семейства функций ...printf. В следующей таблице дается список типов преобразований, входной тип аргумента и выходной тип после преобразования. Информация, представленная в данной таблице предполагает, что в формате отсутствуют кроме типа преобразования, все остальные характеристики: флажки, ширина, точность, размер. Чтобы увидеть, как влияет на вывод добавления к формату какоголибо необязательного спецификатора, смотрите таблицу, следующую за данной. --------------T------------T----------------------------------------- Символ ¦ Входной ¦ Выходной аргумент преобразования¦ аргумент ¦ --------------+------------+----------------------------------------- числовые данные --------------T------------T----------------------------------------- d ¦ целое ¦ целое десятичное со знаком i ¦ целое ¦ целое десятичное со знаком o ¦ целое ¦ целое восьмеричное без знака u ¦ целое ¦ целое десятичное без знака x ¦ целое ¦ целое шестнадцатеричное без знака ¦ ¦ (с буквами a, b, c, d, e, f) X ¦ целое ¦ целое шестнадцатеричное без знака ¦ ¦ (с буквами A, B, C, D, E, F). f ¦с плавающей ¦ значение со знаком в форме [-]dddd. ¦ точкой ¦ dddd e ¦с плавающей ¦ значение со знаком в форме [-]d.dddd ¦ точкой ¦ e[+/-]ddd g ¦с плавающей ¦ значение со знаком либо в форме f, либо ¦ точкой ¦ в форме e, с данным значением и точнос- ¦ ¦ тью. Хвостовые нули и десятичная точка ¦ ¦ печатаются только при необходимости E ¦с плавающей ¦ так же, как в случае e, только с буквой ¦ точкой ¦ E для обозначения степени G ¦с плавающей ¦ так же, как в случае g, только с буквой ¦ точкой ¦ E для обозначения степени --------------+------------+----------------------------------------- Символьные данные. --------------T------------T----------------------------------------- C ¦ символьное ¦ один символ S ¦ указатель ¦ печатает символы до тех пор, пока не ¦ на строку ¦ встретится нулевое окончание, либо не ¦ ¦ будет достигнута точность. % ¦ нет символа¦ печатается только знак %. --------------+------------+----------------------------------------- Указатели --------------T------------T----------------------------------------- n ¦ указатель ¦ сохраняется (по адресу, указанному во ¦ на целое ¦ входном аргументе) кол-во только что за- ¦ ¦ писанных символов. P ¦ указатель ¦ печатает входной аргумент,как указатель; ¦ ¦ дальние указатели печатаются, как ¦ ¦ XXXX:YYYY, ближние указатели печатаются, ¦ ¦ как YYYY (только смещение). --------------+------------+----------------------------------------- Соглашения. В нижеследующей таблице перечислены некоторые соглашения, сопровождающие данные спецификации. ------------T-------------------------------------------------------- Символы ¦ Соглашения ------------+-------------------------------------------------------- e или E ¦ аргумент преобразуется в соответствии с шаблоном: ¦ [-]d.ddd...e[+/-]ddd, где ¦ - одна цифра предшествует десятичной точке; ¦ - число цифр после десятичной точки равно точности; ¦ - степень всегда содержит три цифры. f ¦ аргумент преобразуется в десятичную форму в соответст- ¦ вии с шаблоном [-]ddd.ddd..., где число десятичных ¦ цифр после запятой равно точности (если дана ненулевая ¦ точность). g или G ¦ аргумент печатается по принципу e, E или f, с точнос- ¦ тью, обозначающей число значащих цифр. ¦ Хвостовые нули удаляются, десятичная точка ставится ¦ только при необходимости. ¦ аргумент печатается по принципу e или f (с некоторыми ¦ ограничениями), если символ преобразования g; и по ¦ принципу E, если символ преобразования G. ¦ Принцип e используется только в том случае, если экспо- ¦ нента, полученная в результате либо а) больше, чем точ- ¦ ность; б) меньше чем -4. x или X ¦ Для преобразований типа x - в выводе будут буквы a, b, ¦ c, d, e. ¦ Для преобразований типа X - в выводе будут буквы A, B, ¦ C, D, E. ------------+--------------------------------------------------------- Замечание. Неопределенные значения с плавающей точкой печатаются как +INF или -INF. Не числа по IEEE печатаются как +NAN или -NAN. Символы - флаги. Символы - флажки это минус(-), плюс(+), диез(#) и пусто( ); Они могут появляться в любом порядке и комбинации. -----------T--------------------------------------------------------- Флаг ¦ Что это означает -----------+--------------------------------------------------------- - ¦ Левое выравнивание результата, пробелы остаются справа. ¦ Если не задан, результат выравнивается справа, заполня- ¦ ется пробелами или нулями слева. + ¦ Знаковое преобразование - результат всегда начинается со ¦ знака (+) или (-). пусто ¦ Если значение неотрицательно, вывод начинается с пробе- ¦ ла вместо плюса; отрицательные значения всегда начина- ¦ ются со знака минус. # ¦ Специфицирует, что преобразуемый аргумент используется в ¦ "альтернативной" форме. Смотрите следующую таблицу. -----------+--------------------------------------------------------- Примечание. Знак плюс имеет приоритет над пробелом в обоих случаях. Альтернативная форма. Если флаг # используется вместе с символом преобразования, при конвертировании аргумента (arg) это даст следующий результат: ------------------T-------------------------------------------------- Символ ¦ Как # влияет на результат преобразования ¦ ------------------+-------------------------------------------------- c, s, d, i, u ¦ Не оказывает влияния. 0 ¦ 0 предшествует ненулевому arg x или X ¦ 0x (или 0X) предшествует arg e, E или f ¦ Результат всегда будет содержать десятичную точ- ¦ ку, даже если за точкой не следует никаких цифр. ¦ Обычно, десятичная точка появляется в результате, ¦ только если за ней следует цифра. g или G ¦ Аналогично e или E, с дополнением, что хвостовые ¦ нули не удаляются. ------------------+-------------------------------------------------- Спецификация ширины. Спецификация ширины устанавливает минимальную ширину поля для выводимого значения. Ширина задается одним из двух способов: - непосредственно, с помощью строки десятичных цифр; - или косвенно с помощью знаков (*). Если вы используете звездочку (*) для спецификации ширины, следующий аргумент в вызове функции (который должен быть целым) определяет минимальную ширину выводного поля. Не существующая или недостаточная ширина поля ни в коем случае не приведет к усечению поля. Если результат шире, чем объявленная ширина поля, поле будет просто продолжено до необходимой ширины. --------------T------------------------------------------------------ Спецификация ¦ Как это влияет на ширину вывода ширины ¦ --------------+------------------------------------------------------ n ¦ Печатаются по крайней мере n символов. Если выводи- ¦ мое значение меньше, чем n символов, вывод заполня- ¦ ется пробелами (выравнивание справа, если задан флаг ¦ "-", в противном случае - левое выравнивание). 0n ¦ Печатается по крайней мере n символов. Если выводное ¦ значение содержит менее n символов, оно заполняется ¦ слева нулями. * ¦ Спецификация ширины ставится в списке аргументов ¦ перед соответствующим аргументом. --------------+------------------------------------------------------ Спецификация точности. Спецификация точности всегда начинается с точки (.), отделяющей ее от предшествующей спецификации ширины. Затем спецификация точности также, как и ширины, задается либо непосредственно, с помощью строки десятичных цифр, либо косвенно - с помощью знака звездочки (*). Если для спецификации точности используется звездочка (*), следующий аргумент в вызове функции (обязательно целый) определяет точность. Если вы используете звездочки для задания точности или ширины, или для обеих спецификаций, аргумент должен следовать непосредственно за соответствующим спецификатором. ---------------T----------------------------------------------------- Спецификация ¦ Как это влияет на вывод точности ¦ ---------------+----------------------------------------------------- (не дана) ¦ Точность устанавливается по умолчанию (стандартно ¦ =1 для типов d, i, o, u, x, X; ¦ =6 для типов e, E, f; ¦ = все значащие цифры для типов g, G; ¦ = печать первого нулевого символа для типа S; ¦ не влияет на тип c) .0 ¦ Для типов d, i, o, u, x точность устанавливается по ¦ умолчанию. ¦ Для типов e, E, f десятичная точка не печатается. .n ¦ Печатаются n символов или n десятичных знаков; если ¦ выводимое значение содержит больше n символов, оно ¦ может быть усечено или округлено. (Случится это или ¦ нет, зависит от символьного типа). * ¦ Спецификация точности задается в списке аргументов, ¦ причем она предшествует значению форматируемого ар- ¦ гумента. ---------------+----------------------------------------------------- Замечание. Если указана нулевая точность, и спецификатор формата для целого значения (т.е. d, i, o, u, x), и печатаемое значение равно 0, то в этом случае не будут выводится цифровые символы (т.е. поле будет пустое). ---------------T----------------------------------------------------- Символ ¦ Как спецификация точности влияет на преобразование преобразования ¦ ---------------+----------------------------------------------------- d ¦ .n показывает, что будет напечатано по крайней мере i ¦ n цифр. Если выводимый аргумент имеет менее n цифр, o ¦ свободные места в выводе забиваются слева нулями. u ¦ Если же выводимый аргумент имеет больше n цифр, вы- x ¦ ходное значение не усекается. X ¦ ¦ e ¦ .n показывает, что после десятичной точки будет на- E ¦ печатано n символов, причем последняя цифра округ- f ¦ ляется. ¦ g ¦ .n определяет, что будет напечатано максимально n ¦ значащих цифр. G ¦ ¦ c ¦ .n не имеет влияния на вывод ¦ s ¦ .n определяет, что будет напечатано не больше, чем ¦ n символов. ---------------+----------------------------------------------------- Модификатор входного размера. Символ - модификатор входного размера (F, N, h, l или L) дает размер последующего входного аргумента: F = дальний указатель; N = ближний указатель; h = короткое целое; l = длинное целое; L = длинное двойной точности; Модификаторы входного размера (F, N, h, l и L) влияют на то, каким образом функции ...printf интерпретируют тип данных соответствующего входного аргумента arg. Модификаторы F и N применяются только к тем входным аргументам arg, которые представляют собой указатели (%p, %s и %n). Модификаторы h, l и L применяются к числовым аргументам (целые и с плавающей точкой). Оба модификатора F и N интерпретируют входной аргумент arg. Обычно, для преобразований %p, %s, или %n аргумент arg - это указатель стандартного размера для соответствующей модели памяти. F означает: "интерпретировать arg, как дальний указатель". N означает: "интепретировать arg, как ближний указатель". Модификаторы h, l и L отвергают стандартный размер числовых данных входных аргументов: l и L применяется к целым типам данных (d, i, o, u, x, X) и типам данных с плавающей точкой (e, E, f, g и G), в то время как h применяется только к целым данным. Ни h, ни l- модификаторы не оказывают никакого влияния на типы символов(c,s) или указателей(p,n). ------------------T-------------------------------------------------- Модификаторы ¦ Как интерпретируется аргумент входного размера ¦ ------------------+-------------------------------------------------- F ¦ аргумент arg читается, как дальний указатель. N ¦ аргумент arg читается, как ближний указатель. ¦ в сверх-больших моделях памяти N не может ис- ¦ пользоваться ни с каким типом преобразований. h ¦ для типов преобразований d, i, o, u, x, X аргумент ¦ arg интерпретируется, как короткое целое; l ¦ для типов преобразований d, i, o, u, x, X аргумент ¦ интерпретируется, как длинное целое; ¦ для типов преобразований e, E, f, g, G аргумент ин- ¦ терпретируется как число двойной точности. L ¦ интерпретирует arg как длинное с двойной точ- ¦ ность для типов преобразований e, E, f, g, G. ------------------+-------------------------------------------------- Возвращаемое Каждая функция возвращает количество выводимых значение байт. В случае ошибки printf возвращает EOF. Переносимость printf поддерживается на системах UNIX и определена в стандарте Кернигана и Ритчи. Поддерживается стандартом ANSI C. Функция не совместима с Windows. Смотрите также cprintf, ecvt, fprintf, fread, fscanf, putc, puts, putw, scanf, sprintf, vprintf, vsprintf. Пример: #define I 555 #define R 5.5 int main(void) { int i, j, k, l; char buf[7]; char *prefix = &buf; char tp[20]; printf("prefix 6d 6o 8x 10.2e 10.2f\n"); strcpy(prefix, "%"); for (i=0; i<2; i++){ for (j=0; j<2; j++) for (k=0; k<2; k++) for (l=0; l<2; l++) { if (i==0) strcat(prefix,"-"); if (j==0) strcat(prefix,"+"); if (k==0) strcat(prefix,"%"); if (l==0) strcat(prefix,"0"); printf("%5s !",prefix); strcpy(tp, prefix); strcat(tp, "6d !"); printf(tp, I); strcpy(tp,""); strcpy(tp, prefix); strcat(tp, "6o !"); printf(tp, I); strcpy(tp,""); strcpy(tp,prefix); stpcat(tp, "8x !"); printf(tp,I); stpcry(tp,""); stpcry(tp, prefix); strcat(tp, "10.2e !"); printf(tp, R); strcpy(tp, prefix); strcat(tp, "10.2f !"); printf(tp,R); printf(" \n"); stpcry(prefix, "%"); } } } prefix 6d 6o 8x 10.2e 10.2f %-+#0 !+00555 !01053 !0x0022b !+5.50e+000 !+000005.50 ! %-+# !+555 !01053 !0x22b !+5.50e+000 !+5.50 ! %-+0 !+00555 !01053 !000022b !+5.50e+000 !+000005.50 ! %-+ !+555 !1053 !22b !+5.50e+000 !+5.50 ! %-#0 !000555 !001053 !0x00022b !05.50e+000 !0000005.50 ! %-# !555 !01053 !0x22b !5.50e+000 !5.50 ! %-0 !000555 !001053 !0000022b !05.50e+000 !0000005.50 ! %- !555 !1053 !22b !5.50e+000 !5.50 ! %+#0 !+00555 ! 01053 ! 0x0022b !+5.50e+000 !+000005.50 ! %+# ! +555 ! 01053 ! 0x22b !+5.50e+000 ! +5.50 ! %+0 !+00555 ! 01053 ! 000022b !+5.50e+000 !+000005.50 ! %+ ! +555 ! 1053 ! 22b !+5.50e+000 ! +5.50 ! %#0 !000555 !001053 !0x00022b !05.50e+000 !0000005.50 ! %# ! 555 ! 01053 ! 0x22b ! 5.50e+000 ! 5.50 ! %0 !000555 !001053 !0000022b !05.50e+000 !0000005.50 ! % ! 555 ! 1053 ! 22b ! 5.50e+000 ! 5.50 !