xref: /dragonfly/lib/libc/stdio/printf.3 (revision d4ef6694)
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. Neither the name of the University nor the names of its contributors
17.\"    may be used to endorse or promote products derived from this software
18.\"    without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\"     @(#)printf.3	8.1 (Berkeley) 6/4/93
33.\" $FreeBSD: src/lib/libc/stdio/printf.3,v 1.63 2009/03/04 03:38:51 das Exp $
34.\"
35.Dd March 3, 2009
36.Dt PRINTF 3
37.Os
38.Sh NAME
39.Nm printf ,
40.Nm fprintf ,
41.Nm sprintf ,
42.Nm snprintf ,
43.Nm asprintf ,
44.Nm dprintf ,
45.Nm vprintf ,
46.Nm vfprintf ,
47.Nm vsprintf ,
48.Nm vsnprintf ,
49.Nm vasprintf ,
50.Nm vdprintf
51.Nd formatted output conversion
52.Sh LIBRARY
53.Lb libc
54.Sh SYNOPSIS
55.Fd "#define _WITH_DPRINTF"
56.In stdio.h
57.Ft int
58.Fn printf "const char * restrict format" ...
59.Ft int
60.Fn fprintf "FILE * restrict stream" "const char * restrict format" ...
61.Ft int
62.Fn sprintf "char * restrict str" "const char * restrict format" ...
63.Ft int
64.Fn snprintf "char * restrict str" "size_t size" "const char * restrict format" ...
65.Ft int
66.Fn asprintf "char **ret" "const char *format" ...
67.Ft int
68.Fn dprintf "int" "const char * restrict format" ...
69.In stdarg.h
70.Ft int
71.Fn vprintf "const char * restrict format" "va_list ap"
72.Ft int
73.Fn vfprintf "FILE * restrict stream" "const char * restrict format" "va_list ap"
74.Ft int
75.Fn vsprintf "char * restrict str" "const char * restrict format" "va_list ap"
76.Ft int
77.Fn vsnprintf "char * restrict str" "size_t size" "const char * restrict format" "va_list ap"
78.Ft int
79.Fn vasprintf "char **ret" "const char *format" "va_list ap"
80.Ft int
81.Fn vdprintf "int fd" "const char * restrict format" "va_list ap"
82.Sh DESCRIPTION
83The
84.Fn printf
85family of functions produces output according to a
86.Fa format
87as described below.
88The
89.Fn printf
90and
91.Fn vprintf
92functions
93write output to
94.Dv stdout ,
95the standard output stream;
96.Fn fprintf
97and
98.Fn vfprintf
99write output to the given output
100.Fa stream ;
101.Fn dprintf
102and
103.Fn vdprintf
104write output to the given file descriptor;
105.Fn sprintf ,
106.Fn snprintf ,
107.Fn vsprintf ,
108and
109.Fn vsnprintf
110write to the character string
111.Fa str ;
112and
113.Fn asprintf
114and
115.Fn vasprintf
116dynamically allocate a new string with
117.Xr malloc 3 .
118.Pp
119These functions write the output under the control of a
120.Fa format
121string that specifies how subsequent arguments
122(or arguments accessed via the variable-length argument facilities of
123.Xr stdarg 3 )
124are converted for output.
125.Pp
126These functions return the number of characters printed
127(not including the trailing
128.Ql \e0
129used to end output to strings) or a negative value if an output error occurs,
130except for
131.Fn snprintf
132and
133.Fn vsnprintf ,
134which return the number of characters that would have been printed if the
135.Fa size
136were unlimited
137(again, not including the final
138.Ql \e0 ) .
139.Pp
140The
141.Fn asprintf
142and
143.Fn vasprintf
144functions
145set
146.Fa *ret
147to be a pointer to a buffer sufficiently large to hold the formatted string.
148This pointer should be passed to
149.Xr free 3
150to release the allocated storage when it is no longer needed.
151If sufficient space cannot be allocated,
152.Fn asprintf
153and
154.Fn vasprintf
155will return \-1 and set
156.Fa ret
157to be a
158.Dv NULL
159pointer.
160.Pp
161The
162.Fn snprintf
163and
164.Fn vsnprintf
165functions
166will write at most
167.Fa size Ns \-1
168of the characters printed into the output string
169(the
170.Fa size Ns 'th
171character then gets the terminating
172.Ql \e0 ) ;
173if the return value is greater than or equal to the
174.Fa size
175argument, the string was too short
176and some of the printed characters were discarded.
177The output is always null-terminated.
178.Pp
179The
180.Fn sprintf
181and
182.Fn vsprintf
183functions
184effectively assume an infinite
185.Fa size .
186.Pp
187The format string is composed of zero or more directives:
188ordinary
189.\" multibyte
190characters (not
191.Cm % ) ,
192which are copied unchanged to the output stream;
193and conversion specifications, each of which results
194in fetching zero or more subsequent arguments.
195Each conversion specification is introduced by
196the
197.Cm %
198character.
199The arguments must correspond properly (after type promotion)
200with the conversion specifier.
201After the
202.Cm % ,
203the following appear in sequence:
204.Bl -bullet
205.It
206An optional field, consisting of a decimal digit string followed by a
207.Cm $ ,
208specifying the next argument to access.
209If this field is not provided, the argument following the last
210argument accessed will be used.
211Arguments are numbered starting at
212.Cm 1 .
213If unaccessed arguments in the format string are interspersed with ones that
214are accessed the results will be indeterminate.
215.It
216Zero or more of the following flags:
217.Bl -tag -width ".So \  Sc (space)"
218.It Sq Cm #
219The value should be converted to an
220.Dq alternate form .
221For
222.Cm c , d , i , n , p , s ,
223and
224.Cm u
225conversions, this option has no effect.
226For
227.Cm o
228conversions, the precision of the number is increased to force the first
229character of the output string to a zero.
230For
231.Cm x
232and
233.Cm X
234conversions, a non-zero result has the string
235.Ql 0x
236(or
237.Ql 0X
238for
239.Cm X
240conversions) prepended to it.
241For
242.Cm a , A , e , E , f , F , g ,
243and
244.Cm G
245conversions, the result will always contain a decimal point, even if no
246digits follow it (normally, a decimal point appears in the results of
247those conversions only if a digit follows).
248For
249.Cm g
250and
251.Cm G
252conversions, trailing zeros are not removed from the result as they
253would otherwise be.
254.It So Cm 0 Sc (zero)
255Zero padding.
256For all conversions except
257.Cm n ,
258the converted value is padded on the left with zeros rather than blanks.
259If a precision is given with a numeric conversion
260.Cm ( d , i , o , u , i , x ,
261and
262.Cm X ) ,
263the
264.Cm 0
265flag is ignored.
266.It Sq Cm \-
267A negative field width flag;
268the converted value is to be left adjusted on the field boundary.
269Except for
270.Cm n
271conversions, the converted value is padded on the right with blanks,
272rather than on the left with blanks or zeros.
273A
274.Cm \-
275overrides a
276.Cm 0
277if both are given.
278.It So "\ " Sc (space)
279A blank should be left before a positive number
280produced by a signed conversion
281.Cm ( a , A , d , e , E , f , F , g , G ,
282or
283.Cm i ) .
284.It Sq Cm +
285A sign must always be placed before a
286number produced by a signed conversion.
287A
288.Cm +
289overrides a space if both are used.
290.It Sq Cm '
291Decimal conversions
292.Cm ( d , u ,
293or
294.Cm i )
295or the integral portion of a floating point conversion
296.Cm ( f
297or
298.Cm F )
299should be grouped and separated by thousands using
300the non-monetary separator returned by
301.Xr localeconv 3 .
302.El
303.It
304An optional decimal digit string specifying a minimum field width.
305If the converted value has fewer characters than the field width, it will
306be padded with spaces on the left (or right, if the left-adjustment
307flag has been given) to fill out
308the field width.
309.It
310An optional precision, in the form of a period
311.Cm \&.
312followed by an
313optional digit string.
314If the digit string is omitted, the precision is taken as zero.
315This gives the minimum number of digits to appear for
316.Cm d , i , o , u , x ,
317and
318.Cm X
319conversions, the number of digits to appear after the decimal-point for
320.Cm a , A , e , E , f ,
321and
322.Cm F
323conversions, the maximum number of significant digits for
324.Cm g
325and
326.Cm G
327conversions, or the maximum number of characters to be printed from a
328string for
329.Cm s
330conversions.
331.It
332An optional length modifier, that specifies the size of the argument.
333The following length modifiers are valid for the
334.Cm d , i , n , o , u , x ,
335or
336.Cm X
337conversion:
338.Bl -column ".Cm q Em (deprecated)" ".Vt signed char" ".Vt unsigned long long" ".Vt long long *"
339.It Sy Modifier Ta Cm d , i Ta Cm o , u , x , X Ta Cm n
340.It Cm hh Ta Vt "signed char" Ta Vt "unsigned char" Ta Vt "signed char *"
341.It Cm h Ta Vt short Ta Vt "unsigned short" Ta Vt "short *"
342.It Cm l No (ell) Ta Vt long Ta Vt "unsigned long" Ta Vt "long *"
343.It Cm ll No (ell ell) Ta Vt "long long" Ta Vt "unsigned long long" Ta Vt "long long *"
344.It Cm j Ta Vt intmax_t Ta Vt uintmax_t Ta Vt "intmax_t *"
345.It Cm t Ta Vt ptrdiff_t Ta (see note) Ta Vt "ptrdiff_t *"
346.It Cm z Ta (see note) Ta Vt size_t Ta (see note)
347.It Cm q Em (deprecated) Ta Vt quad_t Ta Vt u_quad_t Ta Vt "quad_t *"
348.El
349.Pp
350Note:
351the
352.Cm t
353modifier, when applied to a
354.Cm o , u , x ,
355or
356.Cm X
357conversion, indicates that the argument is of an unsigned type
358equivalent in size to a
359.Vt ptrdiff_t .
360The
361.Cm z
362modifier, when applied to a
363.Cm d
364or
365.Cm i
366conversion, indicates that the argument is of a signed type equivalent in
367size to a
368.Vt size_t .
369Similarly, when applied to an
370.Cm n
371conversion, it indicates that the argument is a pointer to a signed type
372equivalent in size to a
373.Vt size_t .
374.Pp
375The following length modifier is valid for the
376.Cm a , A , e , E , f , F , g ,
377or
378.Cm G
379conversion:
380.Bl -column ".Sy Modifier" ".Cm a , A , e , E , f , F , g , G"
381.It Sy Modifier Ta Cm a , A , e , E , f , F , g , G
382.It Cm l No (ell) Ta Vt double
383(ignored, same behavior as without it)
384.It Cm L Ta Vt "long double"
385.El
386.Pp
387The following length modifier is valid for the
388.Cm c
389or
390.Cm s
391conversion:
392.Bl -column ".Sy Modifier" ".Vt wint_t" ".Vt wchar_t *"
393.It Sy Modifier Ta Cm c Ta Cm s
394.It Cm l No (ell) Ta Vt wint_t Ta Vt "wchar_t *"
395.El
396.It
397A character that specifies the type of conversion to be applied.
398.El
399.Pp
400A field width or precision, or both, may be indicated by
401an asterisk
402.Ql *
403or an asterisk followed by one or more decimal digits and a
404.Ql $
405instead of a
406digit string.
407In this case, an
408.Vt int
409argument supplies the field width or precision.
410A negative field width is treated as a left adjustment flag followed by a
411positive field width; a negative precision is treated as though it were
412missing.
413If a single format directive mixes positional
414.Pq Li nn$
415and non-positional arguments, the results are undefined.
416.Pp
417The conversion specifiers and their meanings are:
418.Bl -tag -width ".Cm diouxX"
419.It Cm diouxX
420The
421.Vt int
422(or appropriate variant) argument is converted to signed decimal
423.Cm ( d
424and
425.Cm i ) ,
426unsigned octal
427.Pq Cm o ,
428unsigned decimal
429.Pq Cm u ,
430or unsigned hexadecimal
431.Cm ( x
432and
433.Cm X )
434notation.
435The letters
436.Dq Li abcdef
437are used for
438.Cm x
439conversions; the letters
440.Dq Li ABCDEF
441are used for
442.Cm X
443conversions.
444The precision, if any, gives the minimum number of digits that must
445appear; if the converted value requires fewer digits, it is padded on
446the left with zeros.
447.It Cm DOU
448The
449.Vt "long int"
450argument is converted to signed decimal, unsigned octal, or unsigned
451decimal, as if the format had been
452.Cm ld , lo ,
453or
454.Cm lu
455respectively.
456These conversion characters are deprecated, and will eventually disappear.
457.It Cm eE
458The
459.Vt double
460argument is rounded and converted in the style
461.Sm off
462.Oo \- Oc Ar d Li \&. Ar ddd Li e \\*[Pm] Ar dd
463.Sm on
464where there is one digit before the
465decimal-point character
466and the number of digits after it is equal to the precision;
467if the precision is missing,
468it is taken as 6; if the precision is
469zero, no decimal-point character appears.
470An
471.Cm E
472conversion uses the letter
473.Ql E
474(rather than
475.Ql e )
476to introduce the exponent.
477The exponent always contains at least two digits; if the value is zero,
478the exponent is 00.
479.Pp
480For
481.Cm a , A , e , E , f , F , g ,
482and
483.Cm G
484conversions, positive and negative infinity are represented as
485.Li inf
486and
487.Li -inf
488respectively when using the lowercase conversion character, and
489.Li INF
490and
491.Li -INF
492respectively when using the uppercase conversion character.
493Similarly, NaN is represented as
494.Li nan
495when using the lowercase conversion, and
496.Li NAN
497when using the uppercase conversion.
498.It Cm fF
499The
500.Vt double
501argument is rounded and converted to decimal notation in the style
502.Sm off
503.Oo \- Oc Ar ddd Li \&. Ar ddd ,
504.Sm on
505where the number of digits after the decimal-point character
506is equal to the precision specification.
507If the precision is missing, it is taken as 6; if the precision is
508explicitly zero, no decimal-point character appears.
509If a decimal point appears, at least one digit appears before it.
510.It Cm gG
511The
512.Vt double
513argument is converted in style
514.Cm f
515or
516.Cm e
517(or
518.Cm F
519or
520.Cm E
521for
522.Cm G
523conversions).
524The precision specifies the number of significant digits.
525If the precision is missing, 6 digits are given; if the precision is zero,
526it is treated as 1.
527Style
528.Cm e
529is used if the exponent from its conversion is less than \-4 or greater than
530or equal to the precision.
531Trailing zeros are removed from the fractional part of the result; a
532decimal point appears only if it is followed by at least one digit.
533.It Cm aA
534The
535.Vt double
536argument is rounded and converted to hexadecimal notation in the style
537.Sm off
538.Oo \- Oc Li 0x Ar h Li \&. Ar hhhp Oo \\*[Pm] Oc Ar d ,
539.Sm on
540where the number of digits after the hexadecimal-point character
541is equal to the precision specification.
542If the precision is missing, it is taken as enough to represent
543the floating-point number exactly, and no rounding occurs.
544If the precision is zero, no hexadecimal-point character appears.
545The
546.Cm p
547is a literal character
548.Ql p ,
549and the exponent consists of a positive or negative sign
550followed by a decimal number representing an exponent of 2.
551The
552.Cm A
553conversion uses the prefix
554.Dq Li 0X
555(rather than
556.Dq Li 0x ) ,
557the letters
558.Dq Li ABCDEF
559(rather than
560.Dq Li abcdef )
561to represent the hex digits, and the letter
562.Ql P
563(rather than
564.Ql p )
565to separate the mantissa and exponent.
566.Pp
567Note that there may be multiple valid ways to represent floating-point
568numbers in this hexadecimal format.
569For example,
570.Li 0x1.92p+1 , 0x3.24p+0 , 0x6.48p-1 ,
571and
572.Li 0xc.9p-2
573are all equivalent.
574.Fx 8.0
575and later always prints finite non-zero numbers using
576.Ql 1
577as the digit before the hexadecimal point.
578Zeroes are always represented with a mantissa of 0 (preceded by a
579.Ql -
580if appropriate) and an exponent of
581.Li +0 .
582.It Cm C
583Treated as
584.Cm c
585with the
586.Cm l
587(ell) modifier.
588.It Cm c
589The
590.Vt int
591argument is converted to an
592.Vt "unsigned char" ,
593and the resulting character is written.
594.Pp
595If the
596.Cm l
597(ell) modifier is used, the
598.Vt wint_t
599argument shall be converted to a
600.Vt wchar_t ,
601and the (potentially multi-byte) sequence representing the
602single wide character is written, including any shift sequences.
603If a shift sequence is used, the shift state is also restored
604to the original state after the character.
605.It Cm S
606Treated as
607.Cm s
608with the
609.Cm l
610(ell) modifier.
611.It Cm s
612The
613.Vt "char *"
614argument is expected to be a pointer to an array of character type (pointer
615to a string).
616Characters from the array are written up to (but not including)
617a terminating
618.Dv NUL
619character;
620if a precision is specified, no more than the number specified are
621written.
622If a precision is given, no null character
623need be present; if the precision is not specified, or is greater than
624the size of the array, the array must contain a terminating
625.Dv NUL
626character.
627.Pp
628If the
629.Cm l
630(ell) modifier is used, the
631.Vt "wchar_t *"
632argument is expected to be a pointer to an array of wide characters
633(pointer to a wide string).
634For each wide character in the string, the (potentially multi-byte)
635sequence representing the
636wide character is written, including any shift sequences.
637If any shift sequence is used, the shift state is also restored
638to the original state after the string.
639Wide characters from the array are written up to (but not including)
640a terminating wide
641.Dv NUL
642character;
643if a precision is specified, no more than the number of bytes specified are
644written (including shift sequences).
645Partial characters are never written.
646If a precision is given, no null character
647need be present; if the precision is not specified, or is greater than
648the number of bytes required to render the multibyte representation of
649the string, the array must contain a terminating wide
650.Dv NUL
651character.
652.It Cm p
653The
654.Vt "void *"
655pointer argument is printed in hexadecimal (as if by
656.Ql %#x
657or
658.Ql %#lx ) .
659.It Cm n
660The number of characters written so far is stored into the
661integer indicated by the
662.Vt "int *"
663(or variant) pointer argument.
664No argument is converted.
665.It Cm %
666A
667.Ql %
668is written.
669No argument is converted.
670The complete conversion specification
671is
672.Ql %% .
673.El
674.Pp
675The decimal point
676character is defined in the program's locale (category
677.Dv LC_NUMERIC ) .
678.Pp
679In no case does a non-existent or small field width cause truncation of
680a numeric field; if the result of a conversion is wider than the field
681width, the
682field is expanded to contain the conversion result.
683.Sh EXAMPLES
684To print a date and time in the form
685.Dq Li "Sunday, July 3, 10:02" ,
686where
687.Fa weekday
688and
689.Fa month
690are pointers to strings:
691.Bd -literal -offset indent
692#include <stdio.h>
693fprintf(stdout, "%s, %s %d, %.2d:%.2d\en",
694	weekday, month, day, hour, min);
695.Ed
696.Pp
697To print \*(Pi
698to five decimal places:
699.Bd -literal -offset indent
700#include <math.h>
701#include <stdio.h>
702fprintf(stdout, "pi = %.5f\en", 4 * atan(1.0));
703.Ed
704.Pp
705To allocate a 128 byte string and print into it:
706.Bd -literal -offset indent
707#include <stdio.h>
708#include <stdlib.h>
709#include <stdarg.h>
710char *newfmt(const char *fmt, ...)
711{
712	char *p;
713	va_list ap;
714	if ((p = malloc(128)) == NULL)
715		return (NULL);
716	va_start(ap, fmt);
717	(void) vsnprintf(p, 128, fmt, ap);
718	va_end(ap);
719	return (p);
720}
721.Ed
722.Sh SECURITY CONSIDERATIONS
723The
724.Fn sprintf
725and
726.Fn vsprintf
727functions are easily misused in a manner which enables malicious users
728to arbitrarily change a running program's functionality through
729a buffer overflow attack.
730Because
731.Fn sprintf
732and
733.Fn vsprintf
734assume an infinitely long string,
735callers must be careful not to overflow the actual space;
736this is often hard to assure.
737For safety, programmers should use the
738.Fn snprintf
739interface instead.
740For example:
741.Bd -literal
742void
743foo(const char *arbitrary_string, const char *and_another)
744{
745	char onstack[8];
746
747#ifdef BAD
748	/*
749	 * This first sprintf is bad behavior.  Do not use sprintf!
750	 */
751	sprintf(onstack, "%s, %s", arbitrary_string, and_another);
752#else
753	/*
754	 * The following two lines demonstrate better use of
755	 * snprintf().
756	 */
757	snprintf(onstack, sizeof(onstack), "%s, %s", arbitrary_string,
758	    and_another);
759#endif
760}
761.Ed
762.Pp
763The
764.Fn printf
765and
766.Fn sprintf
767family of functions are also easily misused in a manner
768allowing malicious users to arbitrarily change a running program's
769functionality by either causing the program
770to print potentially sensitive data
771.Dq "left on the stack" ,
772or causing it to generate a memory fault or bus error
773by dereferencing an invalid pointer.
774.Pp
775.Cm %n
776can be used to write arbitrary data to potentially carefully-selected
777addresses.
778Programmers are therefore strongly advised to never pass untrusted strings
779as the
780.Fa format
781argument, as an attacker can put format specifiers in the string
782to mangle your stack,
783leading to a possible security hole.
784This holds true even if the string was built using a function like
785.Fn snprintf ,
786as the resulting string may still contain user-supplied conversion specifiers
787for later interpolation by
788.Fn printf .
789.Pp
790Always use the proper secure idiom:
791.Pp
792.Dl "snprintf(buffer, sizeof(buffer), \*q%s\*q, string);"
793.Sh COMPATIBILITY
794Many application writers used the name
795.Va dprintf
796before the
797.Fn dprintf
798function was introduced in
799.St -p1003.1 ,
800so a prototype is not provided by default in order to avoid
801compatibility problems.
802Applications that wish to use the
803.Fn dprintf
804function described herein should either request a strict
805.St -p1003.1-2008
806environment by defining the macro
807.Dv _POSIX_C_SOURCE
808to the value 200809 or greater, or by defining the macro
809.Dv _WITH_DPRINTF ,
810prior to the inclusion of
811.In stdio.h .
812For compatibility with GNU libc, defining either
813.Dv _BSD_SOURCE
814or
815.Dv _GNU_SOURCE
816prior to the inclusion of
817.In stdio.h
818will also make
819.Fn dprintf
820available.
821.Pp
822The conversion formats
823.Cm \&%D , \&%O ,
824and
825.Cm %U
826are not standard and
827are provided only for backward compatibility.
828The effect of padding the
829.Cm %p
830format with zeros (either by the
831.Cm 0
832flag or by specifying a precision), and the benign effect (i.e., none)
833of the
834.Cm #
835flag on
836.Cm %n
837and
838.Cm %p
839conversions, as well as other
840nonsensical combinations such as
841.Cm %Ld ,
842are not standard; such combinations
843should be avoided.
844.Sh ERRORS
845In addition to the errors documented for the
846.Xr write 2
847system call, the
848.Fn printf
849family of functions may fail if:
850.Bl -tag -width Er
851.It Bq Er EILSEQ
852An invalid wide character code was encountered.
853.It Bq Er ENOMEM
854Insufficient storage space is available.
855.El
856.Sh SEE ALSO
857.Xr printf 1 ,
858.Xr fmtcheck 3 ,
859.Xr scanf 3 ,
860.Xr setlocale 3 ,
861.Xr wprintf 3
862.Sh STANDARDS
863Subject to the caveats noted in the
864.Sx BUGS
865section below, the
866.Fn fprintf ,
867.Fn printf ,
868.Fn sprintf ,
869.Fn vprintf ,
870.Fn vfprintf ,
871and
872.Fn vsprintf
873functions
874conform to
875.St -ansiC
876and
877.St -isoC-99 .
878With the same reservation, the
879.Fn snprintf
880and
881.Fn vsnprintf
882functions conform to
883.St -isoC-99 ,
884while
885.Fn dprintf
886and
887.Fn vdprintf
888conform to
889.St -p1003.1-2008 .
890.Sh HISTORY
891The functions
892.Fn asprintf
893and
894.Fn vasprintf
895first appeared in the
896.Tn GNU C
897library.
898These were implemented by
899.An Peter Wemm Aq Mt peter@FreeBSD.org
900in
901.Fx 2.2 ,
902but were later replaced with a different implementation
903from
904.An Todd C. Miller Aq Mt Todd.Miller@courtesan.com
905for
906.Ox 2.3 .
907The
908.Fn dprintf
909and
910.Fn vdprintf
911functions were added in
912.Fx 8.0 .
913.Sh BUGS
914The
915.Nm
916family of functions do not correctly handle multibyte characters in the
917.Fa format
918argument.
919