1.\" Copyright (c) 1990, 1991 The Regents of the University of California. 2.\" 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.\" %sccs.include.redist.man% 9.\" 10.\" @(#)printf.3 6.13 (Berkeley) 06/29/91 11.\" 12.Dd 13.Dt PRINTF 3 14.Os 15.Sh NAME 16.Nm printf , 17.Nm fprintf , 18.Nm sprintf , 19.Nm snprintf , 20.Nm vprintf , 21.Nm vfprintf, 22.Nm vsprintf , 23.Nm vsnprintf 24.Nd formatted output conversion 25.Sh SYNOPSIS 26.Fd #include <stdio.h> 27.Ft int 28.Fn printf "const char *format" ... 29.Ft int 30.Fn fprintf "FILE *stream" "const char *format" ... 31.Ft int 32.Fn sprintf "char *str" "const char *format" ... 33.Ft int 34.Fn snprintf "char *str" "size_t size" "const char *format" ... 35.\" .Ft int 36.\" .Fn smprintf "const char *format" ... 37.Fd #include <stdarg.h> 38.Ft int 39.Fn vprintf "const char *format" "va_list ap" 40.Ft int 41.Fn vfprintf "FILE *stream" "const char *format" "va_list ap" 42.Ft int 43.Fn vsprintf "char *str" "char *format" "va_list ap" 44.Ft int 45.Fn vsnprintf "char *str" "size_t size" "const char *format" "va_list ap" 46.\" .Ft int 47.\" .Fn vsmprintf "const char *format" "va_list ap" 48.Sh DESCRIPTION 49The 50.Fn printf 51family of functions produces output according to a 52.Fa format 53as described below. 54.Fn Printf 55and 56.Fn vprintf 57write output to 58.Em stdout, 59the standard output stream; 60.Fn fprintf 61and 62.Fn vfprintf 63write output to the given output 64.Fa stream ; 65.Fn sprintf , 66.Fn snprintf , 67.Fn vsprintf , 68and 69.Fn vsnprintf 70write to the character string 71.Fa str . 72.\" .IR str ; 73.\" and 74.\" .I smprintf 75.\" and 76.\" .I vsmprintf 77.\" dynamically allocate a new string with 78.\" .IR malloc . 79These functions write the output under the control of a 80.Fa format 81string that specifies how subsequent arguments 82(or arguments accessed via the variable-length argument facilities of 83.Xr stdarg 3 ) 84are converted for output. 85.\" Except for 86.\" .I smprintf 87.\" and 88.\" .IR vsmprintf , 89.\" all of these functions return 90These functions return 91the number of characters printed 92(not including the trailing 93.Ql \e0 94used to end output to strings). 95.\" .I Smprintf 96.\" and 97.\" .I vsmprintf 98.\" return a pointer to a string of an appropriate length; 99.\" this pointer should be passed to 100.\" .I free 101.\" to release the associated storage 102.\" when it is no longer needed. 103.\" If sufficient space is not avaliable, 104.\" .I smprintf 105.\" and 106.\" .I vsmprintf 107.\" will return 108.\" .SM 109.\" .BR 110.Fn Snprintf 111and 112.Fn vsnprintf 113will write at most 114.Fa size Ns \-1 115of the characters printed into the output string 116(the 117.Fa size Ns 'th 118character then gets the terminating 119.Ql \e0 ) ; 120if the return value is greater than or equal to the 121.Fa size 122argument, the string was too short 123and some of the printed characters were discarded. 124.Fn Sprintf 125and 126.Fn vsprintf 127effectively assume an infinte 128.Fa size . 129.Pp 130The format string is composed of zero or more directives: 131ordinary 132.\" multibyte 133characters (not 134.Cm % ) , 135which are copied unchanged to the output stream; 136and conversion specifications, each of which results 137in fetching zero or more subsequent arguments. 138Each conversion specification is introduced by 139the character 140.Cm % . 141The arguments must correspond properly (after type promotion) 142with the conversion specifier. 143After the 144.Cm % , 145the following appear in sequence: 146.Bl -bullet 147.It 148Zero or more of the following flags: 149.Bl -hyphen -offset indent 150.It 151a 152.Cm # 153character 154specifying that the value should be converted to an ``alternate form''. 155For 156.Cm c , 157.Cm d , 158.Cm i , 159.Cm n , 160.Cm p , 161.Cm s , 162and 163.Cm u , 164conversions, this option has no effect. 165For 166.Cm o 167conversions, the precision of the number is increased to force the first 168character of the output string to a zero (except if a zero value is printed 169with an explicit precision of zero). 170For 171.Cm x 172and 173.Cm X 174conversions, a non-zero result has the string 175.Ql 0x 176(or 177.Ql 0X 178for 179.Cm X 180conversions) prepended to it. 181For 182.Cm e , 183.Cm E , 184.Cm f , 185.Cm g , 186and 187.Cm G , 188conversions, the result will always contain a decimal point, even if no 189digits follow it (normally, a decimal point appears in the results of 190those conversions only if a digit follows). 191For 192.Cm g 193and 194.Cm G 195conversions, trailing zeros are not removed from the result as they 196would otherwise be. 197.It 198A zero 199.Sq Cm \&0 200character specifying zero padding. 201For all conversions except 202.Cm n , 203the converted value is padded on the left with zeros rather than blanks. 204If a precision is given with a numeric conversion 205.Pf ( Mc d , 206.Cm i , 207.Cm o , 208.Cm u , 209.Cm i , 210.Cm x , 211and 212.Cm X ) , 213the 214.Sq Cm \&0 215flag is ignored. 216.It 217A negative field width flag 218.Sq Cm \- 219indicates the converted value is to be left adjusted on the field boundary. 220Except for 221.Cm n 222conversions, the converted value is padded on the right with blanks, 223rather than on the left with blanks or zeros. 224A 225.Sq Cm \- 226overrides a 227.Sq Cm \&0 228if both are given. 229.It 230A space, specifying that a blank should be left before a positive number 231produced by a signed conversion 232.Pf ( Cm d , 233.Cm e , 234.Cm E , 235.Cm f , 236.Cm g , 237.Cm G , 238or 239.Cm i ) . 240.It 241a 242.Sq Cm + 243character specifying that a sign always be placed before a 244number produced by a signed conversion. 245A 246.Sq Cm + 247overrides a space if both are used. 248.El 249.It 250An optional decimal digit string specifying a minimum field width. 251If the converted value has fewer characters than the field width, it will 252be padded with spaces on the left (or right, if the left-adjustment 253flag has been given) to fill out 254the field width. 255.It 256An optional precision, in the form of a period 257.Sq Cm \&. 258followed by an 259optional digit string. If the digit string is omitted, the precision 260is taken as zero. This gives the minimum number of digits to appear for 261.Cm d , 262.Cm i , 263.Cm o , 264.Cm u , 265.Cm x , 266and 267.Cm X 268conversions, the number of digits to appear after the decimal-point for 269.Cm e , 270.Cm E , 271and 272.Cm f 273conversions, the maximum number of significant digits for 274.Cm g 275and 276.Cm G 277conversions, or the maximum number of characters to be printed from a 278string for 279.Cm s 280conversions. 281.It 282The optional character 283.Cm h , 284specifying that a following 285.Cm d , 286.Cm i , 287.Cm o , 288.Cm u , 289.Cm x , 290or 291.Cm X 292conversion corresponds to a 293.Em short int 294or 295.Em unsigned short int 296argument, or that a following 297.Cm n 298conversion corresponds to a pointer to a 299.Em short int 300argument. 301.It 302The optional character 303.Cm l 304(ell) specifying that a following 305.Cm d , 306.Cm i , 307.Cm o , 308.Cm u , 309.Cm x , 310or 311.Cm X 312conversion applies to a pointer to a 313.Em long int 314or 315.Em unsigned long int 316argument, or that a following 317.Cm n 318conversion corresponds to a pointer to a 319.Em long int 320argument. 321.It 322The character 323.Cm L 324specifying that a following 325.Cm e , 326.Cm E , 327.Cm f , 328.Cm g , 329or 330.Cm G 331conversion corresponds to a 332.Em long double 333argument (but note that long double values are not currently supported 334by the 335.Tn VAX 336and 337.Tn Tahoe 338compilers). 339.It 340A character that specifies the type of conversion to be applied. 341.El 342.Pp 343A field width or precision, or both, may be indicated by 344an asterisk 345.Ql * 346instead of a 347digit string. 348In this case, an 349.Em int 350argument supplies the field width or precision. 351A negative field width is treated as a left adjustment flag followed by a 352positive field width; a negative precision is treated as though it were 353missing. 354.Pp 355The conversion specifiers and their meanings are: 356.Bl -tag -width "diouxX" 357.It Cm diouxX 358The 359.Em int 360(or appropriate variant) argument is converted to signed decimal 361.Pf ( Cm d 362and 363.Cm i ) , 364unsigned octal 365.Pq Cm o , 366unsigned decimal 367.Pq Cm u , 368or unsigned hexadecimal 369.Pf ( Cm x 370and 371.Cm X ) 372notation. The letters 373.Cm abcdef 374are used for 375.Cm x 376conversions; the letters 377.Cm ABCDEF 378are used for 379.m X 380conversions. 381The precision, if any, gives the minimum number of digits that must 382appear; if the converted value requires fewer digits, it is padded on 383the left with zeros. 384.It Cm DOU 385The 386.Em long int 387argument is converted to signed decimal, unsigned octal, or unsigned 388decimal, as if the format had been 389.Cm ld , 390.Cm lo , 391or 392.Cm lu 393respectively. 394These conversion characters are deprecated, and will eventually disappear. 395.It Cm eE 396The 397.Em double 398argument is rounded and converted in the style 399.Sm off 400.Pf [\-]d Cm \&. No ddd Cm e No \\*(Pmdd 401.Sm on 402where there is one digit before the 403decimal-point character 404and the number of digits after it is equal to the precision; 405if the precision is missing, 406it is taken as 6; if the precision is 407zero, no decimal-point character appears. 408An 409.Cm E 410conversion uses the letter 411.Cm E 412(rather than 413.Cm e ) 414to introduce the exponent. 415The exponent always contains at least two digits; if the value is zero, 416the exponent is 00. 417.It Cm f 418The 419.Em double 420argument is rounded and converted to decimal notation in the style 421.Sm off 422.Pf [-]ddd Cm \&. No ddd , 423.Sm on 424where the number of digits after the decimal-point character 425is equal to the precision specification. 426If the precision is missing, it is taken as 6; if the precision is 427explicitly zero, no decimal-point character appears. 428If a decimal point appears, at least one digit appears before it. 429.It Cm g 430The 431.Em double 432argument is converted in style 433.Cm f 434or 435.Cm e 436(or 437.Cm E 438for 439.Cm G 440conversions). 441The precision specifies the number of significant digits. 442If the precision is missing, 6 digits are given; if the precision is zero, 443it is treated as 1. 444Style 445.Cm e 446is used if the exponent from its conversion is less than -4 or greater than 447or equal to the precision. 448Trailing zeros are removed from the fractional part of the result; a 449decimal point appears only if it is followed by at least one digit. 450.It Cm c 451The 452.Em int 453argument is converted to an 454.Em unsigned char , 455and the resulting character is written. 456.It Cm s 457The 458.Dq Em char * 459argument is expected to be a pointer to an array of character type (pointer 460to a string). 461Characters from the array are written up to (but not including) 462a terminating 463.Dv NUL 464character; 465if a precision is specified, no more than the number specified are 466written. 467If a precision is given, no null character 468need be present; if the precision is not specified, or is greater than 469the size of the array, the array must contain a terminating 470.Dv NUL 471character. 472.It Cm p 473The 474.Dq Em void * 475pointer argument is printed in hexadecimal (as if by 476.Ql %#x 477or 478.Ql %#lx ) . 479.It Cm n 480The number of characters written so far is stored into the 481integer indicated by the 482.Dq Em int * 483(or variant) pointer argument. 484No argument is converted. 485.It Cm % 486A 487.Ql % 488is written. No argument is converted. The complete conversion specification 489is 490.Ql %% . 491.El 492.Pp 493In no case does a non-existent or small field width cause truncation of 494a field; if the result of a conversion is wider than the field width, the 495field is expanded to contain the conversion result. 496.Pp 497.Sh EXAMPLES 498.br 499To print a date and time in the form `Sunday, July 3, 10:02', 500where 501.Em weekday 502and 503.Em month 504are pointers to strings: 505.Bd -literal -offset indent 506#include <stdio.h> 507fprintf(stdout, "%s, %s %d, %.2d:%.2d\en", 508 weekday, month, day, hour, min); 509.Ed 510.Pp 511To print \*(Pi 512to five decimal places: 513.Bd -literal -offset indent 514#include <math.h> 515#include <stdio.h> 516fprintf(stdout, "pi = %.5f\en", 4 * atan(1.0)); 517.Ed 518.Pp 519To allocate a 128 byte string and print into it: 520.Bd -literal -offset indent 521#include <stdio.h> 522#include <stdlib.h> 523#include <stdarg.h> 524char *newfmt(const char *fmt, ...) 525{ 526 char *p; 527 va_list ap; 528 if ((p = malloc(128)) == NULL) 529 return (NULL); 530 va_start(ap, fmt); 531 (void) vsnprintf(p, 128, fmt, ap); 532 va_end(ap); 533 return (p); 534} 535.Ed 536.Sh SEE ALSO 537.Xr printf 1 , 538.Xr scanf 3 539.Sh STANDARDS 540The 541.Fn fprintf , 542.Fn printf , 543.Fn sprintf , 544.Fn vprintf , 545.Fn vfprintf , 546and 547.Fn vsprintf 548functions 549conform to 550.St -ansiC . 551.Sh HISTORY 552The functions 553.Fn snprintf 554and 555.Fn vsnprintf 556are new to this release. 557.Sh BUGS 558The conversion formats 559.Cm %D , 560.Cm %O , 561and 562.Cm %U 563are not standard and 564are provided only for backward compatibility. 565The effect of padding the 566.Cm %p 567format with zeros (either by the 568.Sq Cm 0 569flag or by specifying a precision), and the benign effect (i.e., none) 570of the 571.Sq Cm # 572flag on 573.Cm %n 574and 575.Cm %p 576conversions, as well as other 577nonsensical combinations such as 578.Cm %Ld , 579are not standard; such combinations 580should be avoided. 581.Pp 582Because 583.Fn sprintf 584and 585.Fn vsprintf 586assume an infinitely long string, 587callers must be careful not to overflow the actual space; 588this is often impossible to assure. 589For safety, programmers should use the 590.Fn snprintf 591interface instead. 592Unfortunately, this interface is not portable. 593