xref: /freebsd/lib/libc/stdio/printf.3 (revision 99e8005137088aafb1350e23b113d69b01b0820f)
1.\" Copyright (c) 1990, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" This code is derived from software contributed to Berkeley by
5.\" Chris Torek and the American National Standards Committee X3,
6.\" on Information Processing Systems.
7.\"
8.\" Redistribution and use in source and binary forms, with or without
9.\" modification, are permitted provided that the following conditions
10.\" are met:
11.\" 1. Redistributions of source code must retain the above copyright
12.\"    notice, this list of conditions and the following disclaimer.
13.\" 2. Redistributions in binary form must reproduce the above copyright
14.\"    notice, this list of conditions and the following disclaimer in the
15.\"    documentation and/or other materials provided with the distribution.
16.\" 3. All advertising materials mentioning features or use of this software
17.\"    must display the following acknowledgement:
18.\"	This product includes software developed by the University of
19.\"	California, Berkeley and its contributors.
20.\" 4. Neither the name of the University nor the names of its contributors
21.\"    may be used to endorse or promote products derived from this software
22.\"    without specific prior written permission.
23.\"
24.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34.\" SUCH DAMAGE.
35.\"
36.\"     @(#)printf.3	8.1 (Berkeley) 6/4/93
37.\" $FreeBSD$
38.\"
39.Dd June 4, 1993
40.Dt PRINTF 3
41.Os
42.Sh NAME
43.Nm printf ,
44.Nm fprintf ,
45.Nm sprintf ,
46.Nm snprintf ,
47.Nm asprintf ,
48.Nm vprintf ,
49.Nm vfprintf,
50.Nm vsprintf ,
51.Nm vsnprintf ,
52.Nm vasprintf
53.Nd formatted output conversion
54.Sh LIBRARY
55.Lb libc
56.Sh SYNOPSIS
57.Fd #include <stdio.h>
58.Ft int
59.Fn printf "const char *format" ...
60.Ft int
61.Fn fprintf "FILE *stream" "const char *format" ...
62.Ft int
63.Fn sprintf "char *str" "const char *format" ...
64.Ft int
65.Fn snprintf "char *str" "size_t size" "const char *format" ...
66.Ft int
67.Fn asprintf "char **ret" "const char *format" ...
68.Fd #include <stdarg.h>
69.Ft int
70.Fn vprintf "const char *format" "va_list ap"
71.Ft int
72.Fn vfprintf "FILE *stream" "const char *format" "va_list ap"
73.Ft int
74.Fn vsprintf "char *str" "const char *format" "va_list ap"
75.Ft int
76.Fn vsnprintf "char *str" "size_t size" "const char *format" "va_list ap"
77.Ft int
78.Fn vasprintf "char **ret" "const char *format" "va_list ap"
79.Sh DESCRIPTION
80The
81.Fn printf
82family of functions produces output according to a
83.Fa format
84as described below.
85.Fn Printf
86and
87.Fn vprintf
88write output to
89.Em stdout ,
90the standard output stream;
91.Fn fprintf
92and
93.Fn vfprintf
94write output to the given output
95.Fa stream ;
96.Fn sprintf ,
97.Fn snprintf ,
98.Fn vsprintf ,
99and
100.Fn vsnprintf
101write to the character string
102.Fa str ;
103and
104.Fn asprintf
105and
106.Fn vasprintf
107dynamically allocate a new string with
108.Xr malloc 3 .
109.Pp
110These functions write the output under the control of a
111.Fa format
112string that specifies how subsequent arguments
113(or arguments accessed via the variable-length argument facilities of
114.Xr stdarg 3 )
115are converted for output.
116.Pp
117These functions return
118the number of characters printed
119(not including the trailing
120.Ql \e0
121used to end output to strings).
122.Pp
123.Fn Asprintf
124and
125.Fn vasprintf
126set
127.Fa *ret
128to be a pointer to a buffer sufficiently large to hold the formatted string.
129This pointer should be passed to
130.Xr free 3
131to release the allocated storage when it is no longer needed.
132If sufficient space cannot be allocated,
133.Fn asprintf
134and
135.Fn vasprintf
136will return -1 and set
137.Fa ret
138to be a NULL pointer.
139.Pp
140.Fn Snprintf
141and
142.Fn vsnprintf
143will write at most
144.Fa size Ns \-1
145of the characters printed into the output string
146(the
147.Fa size Ns 'th
148character then gets the terminating
149.Ql \e0 ) ;
150if the return value is greater than or equal to the
151.Fa size
152argument, the string was too short
153and some of the printed characters were discarded.
154.Pp
155.Fn Sprintf
156and
157.Fn vsprintf
158effectively assume an infinite
159.Fa size .
160.Pp
161The format string is composed of zero or more directives:
162ordinary
163.\" multibyte
164characters (not
165.Cm % ) ,
166which are copied unchanged to the output stream;
167and conversion specifications, each of which results
168in fetching zero or more subsequent arguments.
169Each conversion specification is introduced by
170the character
171.Cm % .
172The arguments must correspond properly (after type promotion)
173with the conversion specifier.
174After the
175.Cm % ,
176the following appear in sequence:
177.Bl -bullet
178.It
179An optional field, consisting of a decimal digit string followed by a
180.Cm $ ,
181specifying the next argument to access .
182If this field is not provided, the argument following the last
183argument accessed will be used.
184Arguments are numbered starting at
185.Cm 1 .
186If unaccessed arguments in the format string are interspersed with ones that
187are accessed the results will be indeterminate.
188.It
189Zero or more of the following flags:
190.Bl -hyphen
191.It
192A
193.Cm #
194character
195specifying that the value should be converted to an ``alternate form''.
196For
197.Cm c ,
198.Cm d ,
199.Cm i ,
200.Cm n ,
201.Cm p ,
202.Cm s ,
203and
204.Cm u ,
205conversions, this option has no effect.
206For
207.Cm o
208conversions, the precision of the number is increased to force the first
209character of the output string to a zero (except if a zero value is printed
210with an explicit precision of zero).
211For
212.Cm x
213and
214.Cm X
215conversions, a non-zero result has the string
216.Ql 0x
217(or
218.Ql 0X
219for
220.Cm X
221conversions) prepended to it.
222For
223.Cm e ,
224.Cm E ,
225.Cm f ,
226.Cm g ,
227and
228.Cm G ,
229conversions, the result will always contain a decimal point, even if no
230digits follow it (normally, a decimal point appears in the results of
231those conversions only if a digit follows).
232For
233.Cm g
234and
235.Cm G
236conversions, trailing zeros are not removed from the result as they
237would otherwise be.
238.It
239A zero
240.Sq Cm \&0
241character specifying zero padding.
242For all conversions except
243.Cm n ,
244the converted value is padded on the left with zeros rather than blanks.
245If a precision is given with a numeric conversion
246.Pf ( Cm d ,
247.Cm i ,
248.Cm o ,
249.Cm u ,
250.Cm i ,
251.Cm x ,
252and
253.Cm X ) ,
254the
255.Sq Cm \&0
256flag is ignored.
257.It
258A negative field width flag
259.Sq Cm \-
260indicates the converted value is to be left adjusted on the field boundary.
261Except for
262.Cm n
263conversions, the converted value is padded on the right with blanks,
264rather than on the left with blanks or zeros.
265A
266.Sq Cm \-
267overrides a
268.Sq Cm \&0
269if both are given.
270.It
271A space, specifying that a blank should be left before a positive number
272produced by a signed conversion
273.Pf ( Cm d ,
274.Cm e ,
275.Cm E ,
276.Cm f ,
277.Cm g ,
278.Cm G ,
279or
280.Cm i ) .
281.It
282A
283.Sq Cm +
284character specifying that a sign always be placed before a
285number produced by a signed conversion.
286A
287.Sq Cm +
288overrides a space if both are used.
289.El
290.It
291An optional decimal digit string specifying a minimum field width.
292If the converted value has fewer characters than the field width, it will
293be padded with spaces on the left (or right, if the left-adjustment
294flag has been given) to fill out
295the field width.
296.It
297An optional precision, in the form of a period
298.Sq Cm .\&
299followed by an
300optional digit string.  If the digit string is omitted, the precision
301is taken as zero.  This gives the minimum number of digits to appear for
302.Cm d ,
303.Cm i ,
304.Cm o ,
305.Cm u ,
306.Cm x ,
307and
308.Cm X
309conversions, the number of digits to appear after the decimal-point for
310.Cm e ,
311.Cm E ,
312and
313.Cm f
314conversions, the maximum number of significant digits for
315.Cm g
316and
317.Cm G
318conversions, or the maximum number of characters to be printed from a
319string for
320.Cm s
321conversions.
322.It
323The optional character
324.Cm h ,
325specifying that a following
326.Cm d ,
327.Cm i ,
328.Cm o ,
329.Cm u ,
330.Cm x ,
331or
332.Cm X
333conversion corresponds to a
334.Em short int
335or
336.Em unsigned short int
337argument, or that a following
338.Cm n
339conversion corresponds to a pointer to a
340.Em short int
341argument.
342.It
343The optional character
344.Cm l
345(ell) specifying that a following
346.Cm d ,
347.Cm i ,
348.Cm o ,
349.Cm u ,
350.Cm x ,
351or
352.Cm X
353conversion applies to a pointer to a
354.Em long int
355or
356.Em unsigned long int
357argument, or that a following
358.Cm n
359conversion corresponds to a pointer to a
360.Em long int
361argument.
362.It
363The optional character
364.Cm q ,
365specifying that a following
366.Cm d ,
367.Cm i ,
368.Cm o ,
369.Cm u ,
370.Cm x ,
371or
372.Cm X
373conversion corresponds to a
374.Em quad int
375or
376.Em unsigned quad int
377argument, or that a following
378.Cm n
379conversion corresponds to a pointer to a
380.Em quad int
381argument.
382.It
383The character
384.Cm L
385specifying that a following
386.Cm e ,
387.Cm E ,
388.Cm f ,
389.Cm g ,
390or
391.Cm G
392conversion corresponds to a
393.Em long double
394argument.
395.It
396A character that specifies the type of conversion to be applied.
397.El
398.Pp
399A field width or precision, or both, may be indicated by
400an asterisk
401.Ql *
402or an asterisk followed by one or more decimal digits and a
403.Ql $
404instead of a
405digit string.
406In this case, an
407.Em int
408argument supplies the field width or precision.
409A negative field width is treated as a left adjustment flag followed by a
410positive field width; a negative precision is treated as though it were
411missing.
412If a single format directive mixes positional (nn$)
413and non-positional arguments, the results are undefined.
414.Pp
415The conversion specifiers and their meanings are:
416.Bl -tag -width "diouxX"
417.It Cm diouxX
418The
419.Em int
420(or appropriate variant) argument is converted to signed decimal
421.Pf ( Cm d
422and
423.Cm i ) ,
424unsigned octal
425.Pq Cm o ,
426unsigned decimal
427.Pq Cm u ,
428or unsigned hexadecimal
429.Pf ( Cm x
430and
431.Cm X )
432notation.  The letters
433.Cm abcdef
434are used for
435.Cm x
436conversions; the letters
437.Cm ABCDEF
438are used for
439.Cm X
440conversions.
441The precision, if any, gives the minimum number of digits that must
442appear; if the converted value requires fewer digits, it is padded on
443the left with zeros.
444.It Cm DOU
445The
446.Em long int
447argument is converted to signed decimal, unsigned octal, or unsigned
448decimal, as if the format had been
449.Cm ld ,
450.Cm lo ,
451or
452.Cm lu
453respectively.
454These conversion characters are deprecated, and will eventually disappear.
455.It Cm eE
456The
457.Em double
458argument is rounded and converted in the style
459.Sm off
460.Pf [\-]d Cm \&. No ddd Cm e No \\*(Pmdd
461.Sm on
462where there is one digit before the
463decimal-point character
464and the number of digits after it is equal to the precision;
465if the precision is missing,
466it is taken as 6; if the precision is
467zero, no decimal-point character appears.
468An
469.Cm E
470conversion uses the letter
471.Cm E
472(rather than
473.Cm e )
474to introduce the exponent.
475The exponent always contains at least two digits; if the value is zero,
476the exponent is 00.
477.It Cm f
478The
479.Em double
480argument is rounded and converted to decimal notation in the style
481.Sm off
482.Pf [-]ddd Cm \&. No ddd ,
483.Sm on
484where the number of digits after the decimal-point character
485is equal to the precision specification.
486If the precision is missing, it is taken as 6; if the precision is
487explicitly zero, no decimal-point character appears.
488If a decimal point appears, at least one digit appears before it.
489.It Cm gG
490The
491.Em double
492argument is converted in style
493.Cm f
494or
495.Cm e
496(or
497.Cm E
498for
499.Cm G
500conversions).
501The precision specifies the number of significant digits.
502If the precision is missing, 6 digits are given; if the precision is zero,
503it is treated as 1.
504Style
505.Cm e
506is used if the exponent from its conversion is less than -4 or greater than
507or equal to the precision.
508Trailing zeros are removed from the fractional part of the result; a
509decimal point appears only if it is followed by at least one digit.
510.It Cm c
511The
512.Em int
513argument is converted to an
514.Em unsigned char ,
515and the resulting character is written.
516.It Cm s
517The
518.Dq Em char *
519argument is expected to be a pointer to an array of character type (pointer
520to a string).
521Characters from the array are written up to (but not including)
522a terminating
523.Dv NUL
524character;
525if a precision is specified, no more than the number specified are
526written.
527If a precision is given, no null character
528need be present; if the precision is not specified, or is greater than
529the size of the array, the array must contain a terminating
530.Dv NUL
531character.
532.It Cm p
533The
534.Dq Em void *
535pointer argument is printed in hexadecimal (as if by
536.Ql %#x
537or
538.Ql %#lx ) .
539.It Cm n
540The number of characters written so far is stored into the
541integer indicated by the
542.Dq Em int *
543(or variant) pointer argument.
544No argument is converted.
545.It Cm %
546A
547.Ql %
548is written.
549No argument is converted.
550The complete conversion specification
551is
552.Ql %% .
553.El
554.Pp
555The decimal point
556character is defined in the program's locale (category
557.Dv LC_NUMERIC ) .
558.Pp
559In no case does a non-existent or small field width cause truncation of
560a field; if the result of a conversion is wider than the field width, the
561field is expanded to contain the conversion result.
562.Pp
563.Sh EXAMPLES
564To print a date and time in the form `Sunday, July 3, 10:02',
565where
566.Em weekday
567and
568.Em month
569are pointers to strings:
570.Bd -literal -offset indent
571#include <stdio.h>
572fprintf(stdout, "%s, %s %d, %.2d:%.2d\en",
573	weekday, month, day, hour, min);
574.Ed
575.Pp
576To print \*(Pi
577to five decimal places:
578.Bd -literal -offset indent
579#include <math.h>
580#include <stdio.h>
581fprintf(stdout, "pi = %.5f\en", 4 * atan(1.0));
582.Ed
583.Pp
584To allocate a 128 byte string and print into it:
585.Bd -literal -offset indent
586#include <stdio.h>
587#include <stdlib.h>
588#include <stdarg.h>
589char *newfmt(const char *fmt, ...)
590{
591		char *p;
592		va_list ap;
593		if ((p = malloc(128)) == NULL)
594			return (NULL);
595		va_start(ap, fmt);
596		(void) vsnprintf(p, 128, fmt, ap);
597		va_end(ap);
598		return (p);
599}
600.Ed
601.Sh SEE ALSO
602.Xr printf 1 ,
603.Xr scanf 3
604.Sh STANDARDS
605The
606.Fn fprintf ,
607.Fn printf ,
608.Fn sprintf ,
609.Fn vprintf ,
610.Fn vfprintf ,
611and
612.Fn vsprintf
613functions
614conform to
615.St -isoC .
616.Sh HISTORY
617The functions
618.Fn asprintf
619and
620.Fn vasprintf
621first appeared in the GNU C library.
622These were implemented by
623.An Peter Wemm Aq peter@FreeBSD.org
624in
625.Fx 2.2 ,
626but were later replaced with a different implementation
627from
628.An Todd C. Miller Aq Todd.Miller@courtesan.com
629for
630.Ox 2.3 .
631.Sh BUGS
632The conversion formats
633.Cm \&%D ,
634.Cm \&%O ,
635and
636.Cm %U
637are not standard and
638are provided only for backward compatibility.
639The effect of padding the
640.Cm %p
641format with zeros (either by the
642.Sq Cm 0
643flag or by specifying a precision), and the benign effect (i.e., none)
644of the
645.Sq Cm #
646flag on
647.Cm %n
648and
649.Cm %p
650conversions, as well as other
651nonsensical combinations such as
652.Cm %Ld ,
653are not standard; such combinations
654should be avoided.
655.Pp
656Because
657.Fn sprintf
658and
659.Fn vsprintf
660assume an infinitely long string,
661callers must be careful not to overflow the actual space;
662this is often hard to assure.
663For safety, programmers should use the
664.Fn snprintf
665interface instead.
666Unfortunately, this interface is not portable.
667.Pp
668Never pass a string with user-supplied data as a format without using
669.Ql %s .
670An attacker can put format specifiers in the string to mangle your stack,
671leading to a possible security hole.
672This holds true even if the string was built using a function like
673.Fn snprintf ,
674as the resulting string may still contain user-supplied conversion specifiers
675for later interpolation by
676.Fn printf .
677.Pp
678Always use the proper secure idiom:
679.Pp
680.Dl snprintf(buffer, sizeof(buffer), "%s", string);
681