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