Provided by: manpages-dev_6.8-2_all bug

NAME

       printf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf - formatted
       output conversion

LIBRARY

       Standard C library (libc, -lc)

SYNOPSIS

       #include <stdio.h>

       int printf(const char *restrict format, ...);
       int fprintf(FILE *restrict stream,
                   const char *restrict format, ...);
       int dprintf(int fd,
                   const char *restrict format, ...);
       int sprintf(char *restrict str,
                   const char *restrict format, ...);
       int snprintf(char str[restrict .size], size_t size,
                   const char *restrict format, ...);

       int vprintf(const char *restrict format, va_list ap);
       int vfprintf(FILE *restrict stream,
                   const char *restrict format, va_list ap);
       int vdprintf(int fd,
                   const char *restrict format, va_list ap);
       int vsprintf(char *restrict str,
                   const char *restrict format, va_list ap);
       int vsnprintf(char str[restrict .size], size_t size,
                   const char *restrict format, va_list ap);

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       snprintf(), vsnprintf():
           _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE
               || /* glibc <= 2.19: */ _BSD_SOURCE

       dprintf(), vdprintf():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before glibc 2.10:
               _GNU_SOURCE

DESCRIPTION

       The functions in the printf() family produce output according  to  a  format  as  described  below.   The
       functions  printf()  and  vprintf()  write  output  to  stdout, the standard output stream; fprintf() and
       vfprintf() write output to the given output stream; sprintf(), snprintf(),  vsprintf(),  and  vsnprintf()
       write to the character string str.

       The  function dprintf() is the same as fprintf() except that it outputs to a file descriptor, fd, instead
       of to a stdio(3) stream.

       The functions snprintf() and vsnprintf() write at most size bytes (including the  terminating  null  byte
       ('\0')) to str.

       The  functions vprintf(), vfprintf(), vdprintf(), vsprintf(), vsnprintf() are equivalent to the functions
       printf(), fprintf(), dprintf(), sprintf(), snprintf(), respectively, except that they are called  with  a
       va_list  instead  of  a  variable  number  of  arguments.   These functions do not call the va_end macro.
       Because they invoke the va_arg macro, the value of ap is undefined after the call.  See stdarg(3).

       All of these functions write the output  under  the  control  of  a  format  string  that  specifies  how
       subsequent arguments (or arguments accessed via the variable-length argument facilities of stdarg(3)) are
       converted for output.

       C99 and POSIX.1-2001 specify that  the  results  are  undefined  if  a  call  to  sprintf(),  snprintf(),
       vsprintf(),  or  vsnprintf() would cause copying to take place between objects that overlap (e.g., if the
       target string array and one of the supplied input arguments refer to the same buffer).  See CAVEATS.

   Format of the format string
       The format string is a character string, beginning and ending in its initial shift state,  if  any.   The
       format  string  is  composed  of  zero  or more directives: ordinary characters (not %), which are copied
       unchanged to the output stream; and conversion specifications, each of which results in fetching zero  or
       more subsequent arguments.  Each conversion specification is introduced by the character %, and ends with
       a conversion specifier.  In between there may be (in this order) zero or more flags, an optional  minimum
       field width, an optional precision and an optional length modifier.

       The overall syntax of a conversion specification is:

           %[$][flags][width][.precision][length modifier]conversion

       The arguments must correspond properly (after type promotion) with the conversion specifier.  By default,
       the arguments are used in the order given, where each '*' (see Field width and Precision below) and  each
       conversion  specifier asks for the next argument (and it is an error if insufficiently many arguments are
       given).  One can also specify explicitly which argument is taken, at each  place  where  an  argument  is
       required,  by  writing "%m$" instead of '%' and "*m$" instead of '*', where the decimal integer m denotes
       the position in the argument list of the desired argument, indexed starting from 1.  Thus,

           printf("%*d", width, num);

       and

           printf("%2$*1$d", width, num);

       are equivalent.  The second style allows repeated references to the same argument.  The C99 standard does
       not  include the style using '$', which comes from the Single UNIX Specification.  If the style using '$'
       is used, it must be used throughout for all conversions taking an argument and all  width  and  precision
       arguments, but it may be mixed with "%%" formats, which do not consume an argument.  There may be no gaps
       in the numbers of arguments specified using '$'; for  example,  if  arguments  1  and  3  are  specified,
       argument 2 must also be specified somewhere in the format string.

       For  some  numeric  conversions  a  radix character ("decimal point") or thousands' grouping character is
       used.  The actual character used depends on the LC_NUMERIC part of the locale.  (See setlocale(3).)   The
       POSIX locale uses '.' as radix character, and does not have a grouping character.  Thus,

           printf("%'.2f", 1234567.89);

       results  in  "1234567.89" in the POSIX locale, in "1234567,89" in the nl_NL locale, and in "1.234.567,89"
       in the da_DK locale.

   Flag characters
       The character % is followed by zero or more of the following flags:

       #      The value should be converted to an "alternate form".  For o conversions, the first  character  of
              the  output  string  is  made  zero  (by  prefixing  a 0 if it was not zero already).  For x and X
              conversions, a nonzero result has the string "0x" (or "0X" for X  conversions)  prepended  to  it.
              For  a,  A, e, E, f, F, g, and G conversions, the result will always contain a decimal point, even
              if no digits follow it (normally, a decimal point appears in the results of those conversions only
              if  a  digit follows).  For g and G conversions, trailing zeros are not removed from the result as
              they would  otherwise  be.   For  m,  if  errno  contains  a  valid  error  code,  the  output  of
              strerrorname_np(errno)  is  printed;  otherwise, the value stored in errno is printed as a decimal
              number.  For other conversions, the result is undefined.

       0      The value should be zero padded.  For d, i, o, u, x, X, a, A, e, E, f, F, g,  and  G  conversions,
              the  converted  value  is  padded on the left with zeros rather than blanks.  If the 0 and - flags
              both appear, the 0 flag is ignored.  If a precision is given with an integer conversion (d, i,  o,
              u, x, and X), the 0 flag is ignored.  For other conversions, the behavior is undefined.

       -      The  converted  value  is  to  be  left  adjusted  on  the  field boundary.  (The default is right
              justification.)  The converted value is padded on the right with blanks, rather than on  the  left
              with blanks or zeros.  A - overrides a 0 if both are given.

       ' '    (a  space)  A blank should be left before a positive number (or empty string) produced by a signed
              conversion.

       +      A sign (+ or -) should always be placed before a number  produced  by  a  signed  conversion.   By
              default, a sign is used only for negative numbers.  A + overrides a space if both are used.

       The  five flag characters above are defined in the C99 standard.  The Single UNIX Specification specifies
       one further flag character.

       '      For decimal conversion (i, d, u, f, F, g, G) the output is to be grouped with thousands'  grouping
              characters  if the locale information indicates any.  (See setlocale(3).)  Note that many versions
              of gcc(1) cannot parse this option and will issue a warning.  (SUSv2  did  not  include  %'F,  but
              SUSv3 added it.)  Note also that the default locale of a C program is "C" whose locale information
              indicates no thousands' grouping character.  Therefore, without a prior call to  setlocale(3),  no
              thousands' grouping characters will be printed.

       glibc 2.2 adds one further flag character.

       I      For  decimal  integer conversion (i, d, u) the output uses the locale's alternative output digits,
              if any.  For example, since glibc  2.2.3  this  will  give  Arabic-Indic  digits  in  the  Persian
              ("fa_IR") locale.

   Field width
       An  optional  decimal  digit  string (with nonzero first digit) specifying a minimum field width.  If the
       converted value has fewer characters than the field width, it will be padded with spaces on the left  (or
       right,  if the left-adjustment flag has been given).  Instead of a decimal digit string one may write "*"
       or "*m$" (for some decimal integer m) to specify that the field width is given in the next  argument,  or
       in  the m-th argument, respectively, which must be of type int.  A negative field width is taken as a '-'
       flag followed by a positive field width.  In no case does  a  nonexistent  or  small  field  width  cause
       truncation of a field; if the result of a conversion is wider than the field width, the field is expanded
       to contain the conversion result.

   Precision
       An optional precision, in the form of a period ('.')  followed  by  an  optional  decimal  digit  string.
       Instead of a decimal digit string one may write "*" or "*m$" (for some decimal integer m) to specify that
       the precision is given in the next argument, or in the m-th argument, respectively, which must be of type
       int.   If the precision is given as just '.', the precision is taken to be zero.  A negative precision is
       taken as if the precision were omitted.  This gives the minimum number of digits to appear for d,  i,  o,
       u,  x, and X conversions, the number of digits to appear after the radix character for a, A, e, E, f, and
       F conversions, the maximum number of significant digits for g and G conversions, or the maximum number of
       characters to be printed from a string for s and S conversions.

   Length modifier
       Here, "integer conversion" stands for d, i, o, u, x, or X conversion.

       hh     A  following  integer  conversion  corresponds  to  a  signed char or unsigned char argument, or a
              following n conversion corresponds to a pointer to a signed char argument.

       h      A following integer conversion corresponds to a short or unsigned short argument, or a following n
              conversion corresponds to a pointer to a short argument.

       l      (ell)  A  following  integer  conversion  corresponds  to  a  long or unsigned long argument, or a
              following n conversion corresponds to a pointer to a long argument, or a  following  c  conversion
              corresponds  to a wint_t argument, or a following s conversion corresponds to a pointer to wchar_t
              argument.  On a following a, A, e, E, f, F, g, or G conversion, this length  modifier  is  ignored
              (C99; not in SUSv2).

       ll     (ell-ell).   A  following  integer  conversion  corresponds  to  a long long or unsigned long long
              argument, or a following n conversion corresponds to a pointer to a long long argument.

       q      A synonym for ll.  This is a nonstandard extension, derived from BSD; avoid its use in new code.

       L      A following a, A, e, E, f, F, g, or G conversion corresponds to  a  long  double  argument.   (C99
              allows %LF, but SUSv2 does not.)

       j      A  following integer conversion corresponds to an intmax_t or uintmax_t argument, or a following n
              conversion corresponds to a pointer to an intmax_t argument.

       z      A following integer conversion corresponds to a size_t or  ssize_t  argument,  or  a  following  n
              conversion corresponds to a pointer to a size_t argument.

       Z      A nonstandard synonym for z that predates the appearance of z.  Do not use in new code.

       t      A  following  integer  conversion corresponds to a ptrdiff_t argument, or a following n conversion
              corresponds to a pointer to a ptrdiff_t argument.

       SUSv3 specifies all of the above, except for  those  modifiers  explicitly  noted  as  being  nonstandard
       extensions.   SUSv2  specified  only the length modifiers h (in hd, hi, ho, hx, hX, hn) and l (in ld, li,
       lo, lx, lX, ln, lc, ls) and L (in Le, LE, Lf, Lg, LG).

       As a nonstandard extension, the GNU implementations treats ll and L as synonyms, so  that  one  can,  for
       example,  write  llg (as a synonym for the standards-compliant Lg) and Ld (as a synonym for the standards
       compliant lld).  Such usage is nonportable.

   Conversion specifiers
       A character that specifies the type of conversion to be applied.  The  conversion  specifiers  and  their
       meanings are:

       d, i   The  int  argument  is  converted  to  signed  decimal notation.  The precision, if any, gives the
              minimum number of digits that must appear; if the converted value requires  fewer  digits,  it  is
              padded  on  the  left with zeros.  The default precision is 1.  When 0 is printed with an explicit
              precision 0, the output is empty.

       o, u, x, X
              The unsigned int argument is converted to unsigned octal (o), unsigned decimal  (u),  or  unsigned
              hexadecimal (x and X) notation.  The letters abcdef are used for x conversions; the letters ABCDEF
              are used for X conversions.  The precision, if any, gives the minimum number of digits  that  must
              appear;  if  the  converted value requires fewer digits, it is padded on the left with zeros.  The
              default precision is 1.  When 0 is printed with an explicit precision 0, the output is empty.

       e, E   The double argument is rounded and converted in the style [-]d.ddde±dd where there  is  one  digit
              (which is nonzero if the argument is nonzero) before the decimal-point character and the number of
              digits after it is equal to the precision; if the precision is missing, it is taken as 6;  if  the
              precision  is zero, no decimal-point character appears.  An E conversion uses the letter E (rather
              than e) to introduce the exponent.  The exponent always contains at least two digits; if the value
              is zero, the exponent is 00.

       f, F   The  double  argument  is rounded and converted to decimal notation in the style [-]ddd.ddd, where
              the number of digits after the decimal-point character is equal to  the  precision  specification.
              If  the  precision  is missing, it is taken as 6; if the precision is explicitly zero, no decimal-
              point character appears.  If a decimal point appears, at least one digit appears before it.

              (SUSv2 does not know about F and says that character string representations for infinity  and  NaN
              may  be made available.  SUSv3 adds a specification for F.  The C99 standard specifies "[-]inf" or
              "[-]infinity" for infinity, and a string starting with "nan" for NaN, in the case of f conversion,
              and "[-]INF" or "[-]INFINITY" or "NAN" in the case of F conversion.)

       g, G   The  double  argument  is  converted in style f or e (or F or E for G conversions).  The precision
              specifies the number of significant digits.  If the precision is missing, 6 digits are  given;  if
              the precision is zero, it is treated as 1.  Style e is used if the exponent from its conversion is
              less than -4 or greater than or equal to the precision.   Trailing  zeros  are  removed  from  the
              fractional  part  of  the  result;  a decimal point appears only if it is followed by at least one
              digit.

       a, A   (C99; not in SUSv2, but added in SUSv3) For a conversion, the  double  argument  is  converted  to
              hexadecimal  notation (using the letters abcdef) in the style [-]0xh.hhhhp±d; for A conversion the
              prefix 0X, the letters ABCDEF, and the exponent separator P is used.   There  is  one  hexadecimal
              digit  before the decimal point, and the number of digits after it is equal to the precision.  The
              default precision suffices for an exact representation of the value if an exact representation  in
              base 2 exists and otherwise is sufficiently large to distinguish values of type double.  The digit
              before the decimal point is unspecified for  nonnormalized  numbers,  and  nonzero  but  otherwise
              unspecified for normalized numbers.  The exponent always contains at least one digit; if the value
              is zero, the exponent is 0.

       c      If no l modifier is present, the int argument is converted to an unsigned char, and the  resulting
              character  is  written.   If  an  l  modifier  is present, the wint_t (wide character) argument is
              converted to a multibyte sequence by a call to the wcrtomb(3) function, with  a  conversion  state
              starting in the initial state, and the resulting multibyte string is written.

       s      If  no l modifier is present: the const char * argument is expected to be a pointer to an array of
              character type (pointer to a string).  Characters from the  array  are  written  up  to  (but  not
              including)  a  terminating  null byte ('\0'); if a precision is specified, no more than the number
              specified are written.  If a precision is given, no null byte need be present; if the precision is
              not specified, or is greater than the size of the array, the array must contain a terminating null
              byte.

              If an l modifier is present: the const wchar_t * argument is expected to be a pointer to an  array
              of wide characters.  Wide characters from the array are converted to multibyte characters (each by
              a call to the wcrtomb(3) function, with a conversion state starting in the  initial  state  before
              the  first  wide character), up to and including a terminating null wide character.  The resulting
              multibyte characters are written up to (but not  including)  the  terminating  null  byte.   If  a
              precision  is  specified,  no  more  bytes  than  the number specified are written, but no partial
              multibyte characters are written.  Note that the precision determines the number of bytes written,
              not  the number of wide characters or screen positions.  The array must contain a terminating null
              wide character, unless a precision is given and it is so small that the number  of  bytes  written
              exceeds it before the end of the array is reached.

       C      (Not in C99 or C11, but in SUSv2, SUSv3, and SUSv4.)  Synonym for lc.  Don't use.

       S      (Not in C99 or C11, but in SUSv2, SUSv3, and SUSv4.)  Synonym for ls.  Don't use.

       p      The void * pointer argument is printed in hexadecimal (as if by %#x or %#lx).

       n      The number of characters written so far is stored into the integer pointed to by the corresponding
              argument.  That argument shall be an  int *,  or  variant  whose  size  matches  the  (optionally)
              supplied  integer length modifier.  No argument is converted.  (This specifier is not supported by
              the bionic C library.)  The behavior is undefined if the  conversion  specification  includes  any
              flags, a field width, or a precision.

       m      (glibc   extension;   supported  by  uClibc  and  musl.)   Print  output  of  strerror(errno)  (or
              strerrorname_np(errno) in the alternate form).  No argument is required.

       %      A '%' is written.  No argument is converted.  The complete conversion specification is '%%'.

RETURN VALUE

       Upon successful return, these functions return the number of bytes printed (excluding the null byte  used
       to end output to strings).

       The  functions  snprintf()  and  vsnprintf() do not write more than size bytes (including the terminating
       null byte ('\0')).  If the output was truncated due to this limit, then the return value is the number of
       characters  (excluding  the  terminating  null byte) which would have been written to the final string if
       enough space had been available.  Thus, a return value  of  size  or  more  means  that  the  output  was
       truncated.  (See also below under CAVEATS.)

       If an output error is encountered, a negative value is returned.

ATTRIBUTES

       For an explanation of the terms used in this section, see attributes(7).

       ┌───────────────────────────────────────────────────────────────────────┬───────────────┬────────────────┐
       │InterfaceAttributeValue          │
       ├───────────────────────────────────────────────────────────────────────┼───────────────┼────────────────┤
       │printf(), fprintf(), sprintf(), snprintf(), vprintf(), vfprintf(),     │ Thread safety │ MT-Safe locale │
       │vsprintf(), vsnprintf()                                                │               │                │
       └───────────────────────────────────────────────────────────────────────┴───────────────┴────────────────┘

STANDARDS

       fprintf()
       printf()
       sprintf()
       vprintf()
       vfprintf()
       vsprintf()
       snprintf()
       vsnprintf()
              C11, POSIX.1-2008.

       dprintf()
       vdprintf()
              GNU, POSIX.1-2008.

HISTORY

       fprintf()
       printf()
       sprintf()
       vprintf()
       vfprintf()
       vsprintf()
              C89, POSIX.1-2001.

       snprintf()
       vsnprintf()
              SUSv2, C99, POSIX.1-2001.

              Concerning the return value of snprintf(), SUSv2 and C99 contradict each other: when snprintf() is
              called with size=0 then SUSv2 stipulates an unspecified return value less than 1, while C99 allows
              str to be NULL in this case, and gives the return value (as always) as the  number  of  characters
              that  would  have  been written in case the output string has been large enough.  POSIX.1-2001 and
              later align their specification of snprintf() with C99.

       dprintf()
       vdprintf()
              GNU, POSIX.1-2008.

       glibc 2.1 adds length modifiers hh, j, t, and z and conversion characters a and A.

       glibc 2.2 adds the conversion character F with C99 semantics, and the flag character I.

       glibc 2.35 gives a meaning to the alternate form (#) of the m conversion specifier, that is %#m.

CAVEATS

       Some programs imprudently rely on code such as the following

           sprintf(buf, "%s some further text", buf);

       to append text to buf.  However, the standards explicitly note that the results are undefined  if  source
       and  destination  buffers  overlap  when  calling  sprintf(),  snprintf(),  vsprintf(),  and vsnprintf().
       Depending on the version of gcc(1) used, and the compiler options employed, calls such as the above  will
       not produce the expected results.

       The  glibc  implementation of the functions snprintf() and vsnprintf() conforms to the C99 standard, that
       is, behaves as described above, since glibc 2.1.  Until glibc 2.0.6, they would return -1 when the output
       was truncated.

BUGS

       Because  sprintf()  and  vsprintf()  assume  an  arbitrarily  long string, callers must be careful not to
       overflow the actual space; this is often impossible to assure.  Note  that  the  length  of  the  strings
       produced  is  locale-dependent  and  difficult  to  predict.   Use snprintf() and vsnprintf() instead (or
       asprintf(3) and vasprintf(3)).

       Code such as printf(foo); often indicates a bug, since foo may contain a % character.  If foo comes  from
       untrusted  user  input,  it  may  contain %n, causing the printf() call to write to memory and creating a
       security hole.

EXAMPLES

       To print Pi to five decimal places:

           #include <math.h>
           #include <stdio.h>
           fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));

       To print a date and time in the form "Sunday, July 3, 10:02", where weekday and  month  are  pointers  to
       strings:

           #include <stdio.h>
           fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
                   weekday, month, day, hour, min);

       Many  countries  use the day-month-year order.  Hence, an internationalized version must be able to print
       the arguments in an order specified by the format:

           #include <stdio.h>
           fprintf(stdout, format,
                   weekday, month, day, hour, min);

       where format depends on locale, and may permute the arguments.  With the value:

           "%1$s, %3$d. %2$s, %4$d:%5$.2d\n"

       one might obtain "Sonntag, 3. Juli, 10:02".

       To allocate a sufficiently large string and print into it (code correct for  both  glibc  2.0  and  glibc
       2.1):

       #include <stdio.h>
       #include <stdlib.h>
       #include <stdarg.h>

       char *
       make_message(const char *fmt, ...)
       {
           int n = 0;
           size_t size = 0;
           char *p = NULL;
           va_list ap;

           /* Determine required size. */

           va_start(ap, fmt);
           n = vsnprintf(p, size, fmt, ap);
           va_end(ap);

           if (n < 0)
               return NULL;

           size = (size_t) n + 1;      /* One extra byte for '\0' */
           p = malloc(size);
           if (p == NULL)
               return NULL;

           va_start(ap, fmt);
           n = vsnprintf(p, size, fmt, ap);
           va_end(ap);

           if (n < 0) {
               free(p);
               return NULL;
           }

           return p;
       }

       If truncation occurs in glibc versions prior to glibc 2.0.6, this is treated as an error instead of being
       handled gracefully.

SEE ALSO

       printf(1), asprintf(3), puts(3), scanf(3), setlocale(3), strfromd(3), wcrtomb(3), wprintf(3), locale(5)