PRINTF(3C) | Standard C Library Functions | PRINTF(3C) |
printf
, fprintf
,
sprintf
, snprintf
,
asprintf
—
#include <stdio.h>
int
printf
(const char *restrict
format, /* args */ ...);
int
fprintf
(FILE *restrict stream,
const char *restrict format, /* args
*/ ...);
int
sprintf
(char *restrict s,
const char *restrict format, /* args
*/ ...);
int
snprintf
(char *restrict s,
size_t n, const char *restrict
format, /* args */ ...);
int
asprintf
(char **ret,
const char *restrict format, /* args
*/ ...);
printf
() function places output on the standard
output stream stdout
.
The fprintf
() function places output on on
the named output stream stream.
The sprintf
() function places output,
followed by the null byte (‘\0’), in consecutive bytes
starting at s; it is the user's responsibility to
ensure that enough storage is available.
The snprintf
() function is identical to
sprintf
() with the addition of the argument
n, which specifies the size of the buffer referred to
by s. If n is 0, nothing is
written and s can be a NULL
pointer. Otherwise, output bytes beyond the n-1st are
discarded instead of being written to the array and a null byte is written
at the end of the bytes actually written into the array.
The asprintf
() function is the same as the
sprintf
() function except that it returns, in the
ret argument, a pointer to a buffer sufficiently large
to hold the output string. This pointer should be passed to
free(3C) to release the allocated storage when it is no
longer needed. If sufficient space cannot be allocated, the
asprintf
() function returns -1 and sets
ret to be a NULL
pointer.
Each of these functions converts, formats, and prints its arguments under control of the format. The format is a character string, beginning and ending in its initial shift state, if any. The format is composed of zero or more directives: ordinary characters, which are simply copied to the output stream and conversion specifications, each of which results in the fetching of zero or more arguments. The results are undefined if there are insufficient arguments for the format. If the format is exhausted while arguments remain, the excess arguments are evaluated but are otherwise ignored.
Conversions can be applied to the nth
argument after the format in the argument list, rather
than to the next unused argument. In this case, the conversion specifier
%
(see below) is replaced by the sequence
%
n$
,
where n is a decimal integer in the range [1,
NL_ARGMAX
], giving the position of the argument in
the argument list. This feature provides for the definition of format
strings that select arguments in an order appropriate to specific languages
(see the EXAMPLES section).
In format strings containing the
%
n$
form of conversion specifications, numbered arguments in the argument list
can be referenced from the format string as many times as required.
In format strings containing the %
form of
conversion specifications, each argument in the argument list is used
exactly once.
All forms of the printf
() functions allow
for the insertion of a language-dependent radix character in the output
string. The radix character is defined by the program's locale (category
LC_NUMERIC
). In the POSIX locale, or in a locale
where the radix character is not defined, the radix character defaults to a
period (.).
%
character or by the character sequence
%
n$
,
after which the following appear in sequence:
$
, specifying the next argument to be converted.
If this field is not provided, the args following
the last argument converted will be used.-
), described below, is given to the field width.
The field width takes the form of an asterisk (*
),
described below, or a decimal integer.
If the conversion specifier is s
, a
standard-conforming application (see standards(5))
interprets the field width as the minimum number of bytes to be printed;
an application that is not standard-conforming interprets the field
width as the minimum number of columns of screen display. For an
application that is not standard-conforming,
‘%10s
’ means if the converted
value has a screen width of 7 columns, 3 spaces would be padded on the
right.
If the format is %ws
, then the field
width should be interpreted as the minimum number of columns of screen
display.
d
, i
,
o
, u
,
x
, and X
conversions (the
field is padded with leading zeros); the number of digits to appear after
the radix character for the a
,
A
, e
,
E
, f
, and
F
conversions, the maximum number of significant
digits for the g
and G
conversions; or the maximum number of bytes to be printed from a string in
s
and S
conversions. The
precision takes the form of a period (.
) followed
either by an asterisk (*
), described below, or an
optional decimal digit string, where a null digit string is treated as 0.
If a precision appears with any other conversion specifier, the behavior
is undefined.
If the conversion specifier is s
or
S
, a standard-conforming application (see
standards(5)) interprets the precision as the maximum
number of bytes to be written; an application that is not
standard-conforming interprets the precision as the maximum number of
columns of screen display. For an application that is not
standard-conforming, ‘%.5s
’ would
print only the portion of the string that would display in 5 screen
columns. Only complete characters are written.
For %ws
, the precision should be
interpreted as the maximum number of columns of screen display. The
precision takes the form of a period (.
)
followed by a decimal digit string; a null digit string is treated as
zero. Padding specified by the precision overrides the padding specified
by the field width.
A field width, or precision, or both can be indicated by an
asterisk (*
). In this case, an argument of type
int supplies the field width or precision. Arguments
specifying field width, or precision, or both must appear in that order
before the argument, if any, to be converted. A negative field width is
taken as a -
flag followed by a positive field
width. A negative precision is taken as if the precision were omitted. In
format strings containing the
%
n$
form of a conversion specification, a field width or precision may be
indicated by the sequence
*
m$
,
where m is a decimal integer in the range [1,
NL_ARGMAX
] giving the position in the argument list
(after the format argument) of an integer argument containing the field
width or precision, for example:
printf("%1$d:%2$.*3$d:%4$.*3$d\n", hour,
min, precision, sec);
The format can contain either numbered
argument specifications (that is,
%
n$
and
*
m$
),
or unnumbered argument specifications (that is, %
and *
), but normally not both. The only exception to
this is that %%
can be mixed with the
%
n$
form. The results of mixing numbered and unnumbered argument specifications
in a format string are undefined. When numbered
argument specifications are used, specifying the Nth
argument requires that all the leading arguments, from the first to the
(N-1)th, are specified in the format string.
'
%i
, %d
,
%u
, %f
,
%F
, %g
, or
%G
) will be formatted with thousands' grouping
characters. For other conversions the behavior is undefined. The
non-monetary grouping character is used.-
+
+
or -
). The conversion
will begin with a sign only when a negative value is converted if this
flag is not specified.+
flags
both appear, the space flag will be ignored.#
c
, d
,
i
, s
, and
u
conversions, the flag has no effect. For an
o
conversion, it increases the precision (if
necessary) to force the first digit of the result to be a zero. For
x
or X
conversion, a
non-zero result will have ‘0x
’ (or
‘0X
’) prepended to it. For
a
, A
,
e
, E
,
f
, F
,
g
, and G
conversions, the
result will always contain a radix character, even if no digits follow the
radix character. Without this flag, the radix character appears in the
result of these conversions only if a digit follows it. For
g
and G
conversions,
trailing zeros will not be removed from the result as they normally
are.0
d
, i
,
o
, u
,
x
, X
,
a
, A
,
e
, E
,
f
, F
,
g
, and G
conversions,
leading zeros (following any indication of sign or base) are used to pad
to the field width; no space padding is performed. If the
0
and -
flags both appear,
the 0
flag will be ignored. For
d
, i
,
o
, u
,
x
, and X
conversions, if a
precision is specified, the 0
flag will be
ignored. If the 0
and '
flags both appear, the grouping characters are inserted before zero
padding. For other conversions, the behavior is undefined.hh
d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to a
signed char or unsigned char
argument (the argument will have been promoted according to the integer
promotions, but its value will be converted to signed
char or unsigned char before printing); or
that a following n
conversion specifier applies to
a pointer to a signed char argument.h
d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to a
short or unsigned short
argument (the argument will have been promoted according to the integer
promotions, but its value will be converted to short
or unsigned short before printing); or that a
following n
conversion specifier applies to a
pointer to a short argument.l
(ell)d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to a
long or unsigned long
argument; that a following n
conversion specifier
applies to a pointer to a long argument; that a
following c
conversion specifier applies to a
wint_t argument; that a following
s
conversion specifier applies to a pointer to a
wchar_t argument; or has no effect on a following
a
, A
,
e
, E
,
f
, F
,
g
, or G
conversion
specifier.ll
(ell-ell)d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to a
long long or unsigned long
long argument; or that a following n
conversion specifier applies to a pointer to a long
long argument.j
d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to an
intmax_t or uintmax_t
argument; or that a following n
conversion
specifier applies to a pointer to an intmax_t
argument. See NOTES.z
d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to a
size_t or the corresponding signed integer type
argument; or that a following n
conversion
specifier applies to a pointer to a signed integer type corresponding to
size_t argument.t
d
,
i
, o
,
u
, x
, or
X
conversion specifier applies to a
ptrdiff_t or the corresponding unsigned type
argument; or that a following n
conversion
specifier applies to a pointer to a ptrdiff_t
argument.L
a
,
A
, e
,
E
, f
,
F
, g
, or
G
conversion specifier applies to a
long double argument.If a length modifier appears with any conversion specifier other than as specified above, the behavior is undefined.
The conversion specifiers and their meanings are:
d
,
i
[-]dddd
’. The precision
specifies the minimum number of digits to appear; if the value being
converted can be represented in fewer digits, it will be expanded with
leading zeros. The default precision is 1. The result of converting 0 with
an explicit precision of 0 is no characters.o
dddd
’.
The precision specifies the minimum number of digits to appear; if the
value being converted can be represented in fewer digits, it will be
expanded with leading zeros. The default precision is 1. The result of
converting 0 with an explicit precision of 0 is no characters.u
dddd
’.
The precision specifies the minimum number of digits to appear; if the
value being converted can be represented in fewer digits, it will be
expanded with leading zeros. The default precision is 1. The result of
converting 0 with an explicit precision of 0 is no characters.x
dddd
’; the letters
‘abcdef
’ are used. The precision
specifies the minimum number of digits to appear; if the value being
converted can be represented in fewer digits, it will be expanded with
leading zeros. The default precision is 1. The result of converting 0 with
an explicit precision of 0 is no characters.X
x
conversion specifier
except that letters ‘ABCDEF
’ are
used instead of ‘abcdef
’.f
,
F
[-]ddd.ddd
’, where the
number of digits after the radix character (see
setlocale(3C)) is equal to the precision specification.
If the precision is missing it is taken as 6; if the precision is
explicitly 0 and the #
flag is not specified, no
radix character appears. If a radix character appears, at least 1 digit
appears before it. The converted value is rounded to fit the specified
output format according to the prevailing floating point rounding
direction mode. If the conversion is not exact, an inexact exception is
raised.
For the f
specifier, a
double argument representing an infinity or NaN is
converted in the style of the e
conversion
specifier, except that for an infinite argument,
‘infinity
’ or
‘Infinity
’ is printed when the
precision is at least 8 and ‘inf
’
or ‘Inf
’ is printed otherwise.
For the F
specifier, a
double argument representing an infinity or NaN is
converted in the SUSv3 style of the E
conversion
specifier, except that for an infinite argument,
‘INFINITY
’ is printed when the
precision is at least 8 and ‘INF
’
is printed otherwise.
e
,
E
[-]d.ddde+-dd
’, where there is one
digit before the radix character (which is non-zero if the argument is
non-zero) and the number of digits after it is equal to the precision.
When the precision is missing it is taken as 6; if the precision is 0 and
the #
flag is not specified, no radix character
appears. The E
conversion specifier will produce a
number with ‘E
’ instead of
‘e
’ introducing the exponent. The
exponent always contains at least two digits. The converted value is
rounded to fit the specified output format according to the prevailing
floating point rounding direction mode. If the conversion is not exact, an
inexact exception is raised.
Infinity and NaN values are handled in one of the following ways:
e
specifier, a
double argument representing an infinity is
printed as ‘[-]infinity
’, when
the precision for the conversion is at least 7 and as
‘[-]inf
’ otherwise. A
double argument representing a NaN is printed as
‘[-]nan
’. For the
E
specifier,
‘INF
’,
‘INFINITY
’, and
‘NAN
’ are printed instead of
‘inf
’,
‘infinity
’, and
‘nan
’, respectively. Printing of
the sign follows the rules described above.[-]Infinity
’, when
the precision for the conversion is at least 7 and as
‘[-]Inf
’ otherwise. A
double argument representing a NaN is printed as
‘[-]NaN
’. Printing of the sign
follows the rules described above.g
,
G
f
or e
(or in style
E
in the case of a G
conversion specifier), with the precision specifying the number of
significant digits. If an explicit precision is 0, it is taken as 1. The
style used depends on the value converted: style e
(or E
) will be used only if the exponent resulting
from the 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 radix character appears only if it is followed by a digit.
A double argument representing an
infinity or NaN is converted in the style of the
e
or E
conversion
specifier, except that for an infinite argument,
‘infinity
’,
‘INFINITY
’, or
‘Infinity
’ is printed when the
precision is at least 8 and ‘inf
’,
‘INF
’, or
‘Inf
’ is printed otherwise.
a
,
A
[-]0xh.hhhhp+-d
’, where the single
hexadecimal digit preceding the radix point is 0 if the value converted is
zero and 1 otherwise and the number of hexadecimal digits after it is
equal to the precision; if the precision is missing, the number of digits
printed after the radix point is 13 for the conversion of a
double value, 16 for the conversion of a
long double value on x86, and 28 for the conversion
of a long double value on SPARC; if the precision is
zero and the #
flag is not specified, no
decimal-point character will appear. The letters
‘abcdef
’ are used for
a
conversion and the letters
‘ABCDEF
’ for
A
conversion. The A
conversion specifier produces a number with
‘X
’ and
‘P
’ instead of
‘x
’ and
‘p
’. The exponent will always
contain at least one digit, and only as many more digits as necessary to
represent the decimal exponent of 2. If the value is zero, the exponent is
zero.
The converted value is rounded to fit the specified output format according to the prevailing floating point rounding direction mode. If the conversion is not exact, an inexact exception is raised.
A double argument representing an
infinity or NaN is converted in the SUSv3 style of an
e
or E
conversion
specifier.
c
If an l
(ell)
qualifier is present, the wint_t argument is
converted as if by an ls
conversion
specification with no precision and an argument that points to a
two-element array of type wchar_t, the first
element of which contains the wint_t argument to
the ls
conversion specification and the second
element contains a null wide-character.
C
lc
.wc
s
If an l
(ell)
qualifier is present, the argument must be a pointer to an array of type
wchar_t. Wide-characters from the array are
converted to characters (each as if by a call to the
wcrtomb(3C) function, with the conversion state
described by an mbstate_t object initialized to
zero before the first wide-character is converted) up to and including a
terminating null wide-character. The resulting characters are written up
to (but not including) the terminating null character (byte). If no
precision is specified, the array must contain a null wide-character. If
a precision is specified, no more than that many characters (bytes) are
written (including shift sequences, if any), and the array must contain
a null wide-character if, to equal the character sequence length given
by the precision, the function would need to access a wide-character one
past the end of the array. In no case is a partial character
written.
S
ls
.ws
p
%p
conversion of the scanf(3C)
function.n
printf
() functions. No argument
is converted.%
%
’; no argument is
converted. The entire conversion specification must be
%%
.If a conversion specification does not match one of the above forms, the behavior is undefined.
In no case does a non-existent or small field width cause
truncation of a field; if the result of a conversion is wider than the field
width, the field is simply expanded to contain the conversion result.
Characters generated by printf
() and
fprintf
() are printed as if the
putc(3C) function had been called.
The st_ctime and
st_mtime fields of the file will be marked for update
between the call to a successful execution of
printf
() or fprintf
() and
the next successful completion of a call to fflush(3C) or
fclose(3C) on the same stream or a call to
exit(3C) or abort(3C).
printf
(), fprintf
(),
sprintf
(), and asprintf
()
functions return the number of bytes transmitted (excluding the terminating
null byte in the case of sprintf
() and
asprintf
()).
The snprintf
() function returns the number
of bytes that would have been written to s if
n had been sufficiently large (excluding the
terminating null byte). If the value of n is 0 on a
call to snprintf
(), s can be a
null pointer and the number of bytes that would have been written if
n had been sufficiently large (excluding the
terminating null byte) is returned.
Each function returns a negative value if an output error was encountered.
printf
() functions has
any objects of type wint_t or
wchar_t, it must also include the header
<wchar.h>
to have these
objects defined.
printf
()
functions, but these sequences are processed by the C compiler, not by the
printf
() function.
In addition, the C language supports character sequences of the
form \
octal-number and
\
hex-number which translates
into the character represented by the octal or hexadecimal number. For
example, if ASCII representations are being used, the letter 'a' may be
written as ‘\141
’ and 'Z' as
‘\132
’. This syntax is most frequently
used to represent the null character as
‘\0
’. This is exactly equivalent to
the numeric constant zero (0). Note that the octal number does not include
the zero prefix as it would for a normal octal constant. To specify a
hexadecimal number, omit the zero so that the prefix is an 'x' (uppercase
'X' is not allowed in this context). Support for hexadecimal sequences is an
ANSI extension. See standards(5).
printf (format, weekday, month, day,
hour, min);
For American usage, format could be a pointer to the string:
“%s, %s %d,
%d:%.2d\n”
producing the message:
Sunday, July 3, 10:02
whereas for German usage, format could be a pointer to the string:
“%1$s, %3$d. %2$s,
%4$d:%5$.2d\n”
producing the message:
Sonntag, 3. Juli, 10:02
Example 2 To print a date and time in the form
‘Sunday, July 3, 10:02
’, where
weekday and month are pointers
to null-terminated strings:
printf("%s, %s %i,
%d:%.2d", weekday, month, day, hour, min);
Example 3 To print pi to 5 decimal places:
printf("pi = %.5f", 4 *
atan(1.0));
Example 4 The following example applies only to applications that are not standard-conforming. To print a list of names in columns which are 20 characters wide:
printf("%20s%20s%20s",
lastname, firstname, middlename);
printf
() and
fprintf
() will fail and may fail, refer to
fputc(3C) or fputwc(3C).
The snprintf
() function will fail if:
EOVERFLOW
INT_MAX
or the number of bytes needed to hold the
output excluding the terminating null is greater than
INT_MAX
.The printf
(),
fprintf
(), sprintf
(), and
snprintf
() functions may fail if:
EILSEQ
EINVAL
The printf
(),
fprintf
(), and asprintf
()
functions may fail due to an underlying malloc(3C) failure
if:
sprintf
() and snprintf
()
functions are Async-Signal-Safe.
printf
(), fprintf
(),
sprintf
(), and snprintf
(). The
asprintf
() function is modeled on the one that appears
in the FreeBSD, NetBSD, and
GNU C libraries.
j
length modifier is used, 32-bit applications
that were compiled using c89
on releases prior to
Solaris 10 will experience undefined behavior.
The snprintf
() return value when
n is 0 was changed in the Solaris 10 release. The
change was based on the SUSv3 specification. The previous behavior was based
on the initial SUSv2 specification, where snprintf
()
when n is 0 returns an unspecified value less than
1.
July 10, 2020 | illumos |