Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

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

#ifdef BAD
	/*
	 * This first sprintf is bad behavior.  Do not use sprintf!
	 */
	sprintf(onstack, "%s, %s", arbitrary_string, and_another);
#else
	/*
	 * The following two lines demonstrate better use of
	 * snprintf().
	 */
	snprintf(onstack, sizeof(onstack), "%s, %s", arbitrary_string,
	    and_another);
#endif
}
.Ed
.Pp
The
.Fn printf
and
.Fn sprintf
family of functions are also easily misused in a manner
allowing malicious users to arbitrarily change a running program's
functionality by either causing the program
to print potentially sensitive data
.Dq "left on the stack" ,
or causing it to generate a memory fault or bus error
by dereferencing an invalid pointer.
.Pp
.Cm %n
can be used to write arbitrary data to potentially carefully-selected
addresses.
Programmers are therefore strongly advised to never pass untrusted strings
as the
.Fa format
argument, as an attacker can put format specifiers in the string
to mangle your stack,
leading to a possible security hole.
This holds true even if the string was built using a function like
.Fn snprintf ,
as the resulting string may still contain user-supplied conversion specifiers
for later interpolation by
.Fn printf .
.Pp
Always use the proper secure idiom:
.Pp
.Dl "snprintf(buffer, sizeof(buffer), \*q%s\*q, string);"