printf

Функция            Производит форматированный вывод в stdout.

Синтаксис          #include
                   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.

Смотрите также      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 !