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