BSD 4_3_Net_2 release
[unix-history] / usr / src / lib / libc / stdio / printf.3
index 1daf8bc..130246e 100644 (file)
-.\" Copyright (c) 1990 The Regents of the University of California.
+.\" Copyright (c) 1990, 1991 The Regents of the University of California.
 .\" All rights reserved.
 .\"
 .\" This code is derived from software contributed to Berkeley by
-.\" Chris Torek.
+.\" Chris Torek and the American National Standards Committee X3,
+.\" on Information Processing Systems.
 .\"
-.\" %sccs.include.redist.man%
+.\" 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. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. 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.
 .\"
-.\"    @(#)printf.3    6.9 (Berkeley) %G%
+.\" 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.
 .\"
-.TH PRINTF 3 ""
-.UC 7
-.SH NAME
-printf, fprintf, sprintf, snprintf, vprintf, vfprintf,
-vsprintf, vsnprintf \- formatted output conversion
-.SH SYNOPSIS
-.B #include <stdio.h>
-.PP
-.B printf(format
-[ , arg ... ]
-.B )
-.br
-.B char *format;
-.PP
-.B fprintf(stream, format
-[ , arg ... ]
-.B )
-.br
-.SM
-.B FILE
-.B *stream;
-.br
-.B char *format;
-.PP
-.B sprintf(str, format
-[ , arg ... ]
-.B )
-.br
-.B char *str, *format;
-.PP
-.B snprintf(str, size, format
-[ , arg ... ]
-.B )
-.br
-.B char *str;
-.br
-.B size_t size;
-.br
-.B char *format;
-.\" .PP
-.\" .B char *smprintf(format
-.\" [ , arg ... ]
-.\" .B )
-.PP
-.B #include <varargs.h>
-.PP
-.B vprintf(format, ap)
-.br
-.B char *format;
-.br
-.B va_list ap;
-.PP
-.B vfprintf(stream, format, ap)
-.br
-.SM
-.B FILE
-.B *stream;
-.br
-.B char *format;
-.br
-.B va_list ap;
-.PP
-.B vsprintf(str, format, ap)
-.br
-.B char *str, *format;
-.br
-.B va_list ap;
-.PP
-.B vsnprintf(str, size, format, ap)
-.br
-.B char *str;
-.br
-.B size_t size;
-.br
-.B char *format;
-.br
-.B va_list ap;
-.\" .PP
-.\" .B char *vsmprintf(format, ap)
-.\" .br
-.\" .B char *format;
-.\" .br
-.\" .B va_list ap;
-.SH DESCRIPTION
+.\"     @(#)printf.3   6.14 (Berkeley) 7/30/91
+.\"
+.Dd July 30, 1991
+.Dt PRINTF 3
+.Os
+.Sh NAME
+.Nm printf ,
+.Nm fprintf ,
+.Nm sprintf ,
+.Nm snprintf ,
+.Nm vprintf ,
+.Nm vfprintf,
+.Nm vsprintf ,
+.Nm vsnprintf
+.Nd formatted output conversion
+.Sh SYNOPSIS
+.Fd #include <stdio.h>
+.Ft int
+.Fn printf "const char *format" ...
+.Ft int
+.Fn fprintf "FILE *stream" "const char *format" ...
+.Ft int
+.Fn sprintf "char *str" "const char *format" ...
+.Ft int
+.Fn snprintf "char *str" "size_t size" "const char *format" ...
+.\" .Ft int
+.\" .Fn smprintf "const char *format" ...
+.Fd #include <stdarg.h>
+.Ft int
+.Fn vprintf "const char *format" "va_list ap"
+.Ft int
+.Fn vfprintf "FILE *stream" "const char *format" "va_list ap"
+.Ft int
+.Fn vsprintf "char *str" "char *format" "va_list ap"
+.Ft int
+.Fn vsnprintf "char *str" "size_t size" "const char *format" "va_list ap"
+.\" .Ft int
+.\" .Fn vsmprintf "const char *format" "va_list ap"
+.Sh DESCRIPTION
 The
-.I printf
+.Fn printf
 family of functions produces output according to a
-.I format
+.Fa format
 as described below.
-.I Printf
+.Fn Printf
 and
-.I vprintf
-write the standard output stream
-.BR stdout ;
-.I fprintf
+.Fn vprintf
+write output to
+.Em stdout,
+the standard output stream;
+.Fn fprintf
 and
-.I vfprintf
-write the named output
-.IR stream ;
-.IR sprintf ,
-.IR snprintf ,
-.IR vsprintf ,
+.Fn vfprintf
+write output to the given output
+.Fa stream ;
+.Fn sprintf ,
+.Fn snprintf ,
+.Fn vsprintf ,
 and
-.I vsnprintf
+.Fn vsnprintf
 write to the character string
-.IR str .
+.Fa str .
 .\" .IR str ;
 .\" and
 .\" .I smprintf
@@ -121,21 +102,22 @@ write to the character string
 .\" .I vsmprintf
 .\" dynamically allocate a new string with
 .\" .IR malloc .
-Each function converts, formats, and prints the arguments following the
-.I format
-(or accessed via the variable-length argument facilities of
-.IR varargs (3))
-under control of the
-.I format
-argument.
+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.
 .\" Except for
 .\" .I smprintf
 .\" and
 .\" .IR vsmprintf ,
 .\" all of these functions return
-Each function returns
+These functions return
 the number of characters printed
-(not including the trailing `\e0' used to end output to strings).
+(not including the trailing
+.Ql \e0
+used to end output to strings).
 .\" .I Smprintf
 .\" and
 .\" .I vsmprintf
@@ -150,420 +132,487 @@ the number of characters printed
 .\" .I vsmprintf
 .\" will return
 .\" .SM
-.\" .BR NULL .
-.I Snprintf
+.\" .BR
+.Fn Snprintf
 and
-.I vsnprintf
+.Fn vsnprintf
 will write at most
-.IR size \-1
+.Fa size Ns \-1
 of the characters printed into the output string
 (the
-.IR size 'th
-character then gets the terminating `\e0');
+.Fa size Ns 'th
+character then gets the terminating
+.Ql \e0 ) ;
 if the return value is greater than or equal to the
-.I size
+.Fa size
 argument, the string was too short
 and some of the printed characters were discarded.
-.I Sprintf
+.Fn Sprintf
 and
-.I vsprintf
+.Fn vsprintf
 effectively assume an infinte
-.IR size .
-.PP
-The format is a string comprised of two types of objects:
-plain characters, which are simply copied to the output stream,
-and conversion specifications,
-each of which causes conversion and printing of the next successive
-.IR arg .
-These arguments must correspond properly (after type promotion)
+.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.
-Each conversion is introduced by the
-.B %
-(percent sign) character.
-The rest of the conversion includes, in the following order,
-.TP 4
-.B \(bu
+After the
+.Cm % ,
+the following appear in sequence:
+.Bl -bullet
+.It
 Zero or more of the following flags:
-.RS
-.TP 4
-.B \(bu
-a `#' character
+.Bl -hyphen -offset indent
+.It
+a
+.Cm #
+character
 specifying that the value should be converted to an ``alternate form''.
 For 
-.BR c ,
-.BR d ,
-.BR i ,
-.BR n ,
-.BR p ,
-.BR s ,
+.Cm c ,
+.Cm d ,
+.Cm i ,
+.Cm n ,
+.Cm p ,
+.Cm s ,
 and
-.BR u ,
+.Cm u ,
 conversions, this option has no effect.
 For 
-.B o
+.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
-.B x
+.Cm x
 and
-.B X
+.Cm X
 conversions, a non-zero result has the string
-.B 0x
+.Ql 0x
 (or
-.B 0X
+.Ql 0X
 for
-.B X
+.Cm X
 conversions) prepended to it.
 For
-.BR e ,
-.BR E ,
-.BR f ,
-.BR g ,
+.Cm e ,
+.Cm E ,
+.Cm f ,
+.Cm g ,
 and
-.BR G ,
+.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
-.B g
+.Cm g
 and
-.B G
+.Cm G
 conversions, trailing zeros are not removed from the result as they
 would otherwise be.
-.TP 4
-.B \(bu
-A zero `0' character specifying zero padding.
+.It
+A zero
+.Sq Cm \&0
+character specifying zero padding.
 For all conversions except
-.BR n ,
+.Cm n ,
 the converted value is padded on the left with zeros rather than blanks.
 If a precision is given with a numeric conversion
-.RB ( d ,
-.BR i ,
-.BR o ,
-.BR u ,
-.BR i ,
-.BR x ,
+.Pf ( Mc d ,
+.Cm i ,
+.Cm o ,
+.Cm u ,
+.Cm i ,
+.Cm x ,
 and
-.BR X ),
-the `0' flag is ignored.
-.TP 4
-.B \(bu
-A minus sign (`-') specifying left adjustment of the converted value
-in the indicated field.
+.Cm X ) ,
+the
+.Sq Cm \&0
+flag is ignored.
+.It
+A negative field width flag
+.Sq Cm \-
+indicates the converted value is to be left adjusted on the field boundary.
 Except for
-.B n
+.Cm n
 conversions, the converted value is padded on the right with blanks,
 rather than on the left with blanks or zeros.
-A `-' overrides a `0' if both are given.
-.TP 4
-.B \(bu
+A
+.Sq Cm \-
+overrides a
+.Sq Cm \&0
+if both are given.
+.It
 A space, specifying that a blank should be left before a positive number
 produced by a signed conversion
-.RB ( d ,
-.BR e ,
-.BR E ,
-.BR f ,
-.BR g ,
-.BR G ,
+.Pf ( Cm d ,
+.Cm e ,
+.Cm E ,
+.Cm f ,
+.Cm g ,
+.Cm G ,
 or
-.BR i ).
-.TP 4
-.B \(bu
-a `+' character specifying that a sign always be placed before a
+.Cm i ) .
+.It
+a
+.Sq Cm +
+character specifying that a sign always be placed before a
 number produced by a signed conversion.
-A `+' overrides a space if both are used.
-.RE
-.TP 4
-.B \(bu
-An optional digit string specifying a field width.
+A
+.Sq Cm +
+overrides a space if both are used.
+.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 on the left (or right, if the left-adjustment flag is used) to
-make up the field width.
-.TP 4
-.B \(bu
-An optional precision, in the form of a period (`.') followed by an
+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
-.BR d ,
-.BR i ,
-.BR o ,
-.BR u ,
-.BR x ,
+.Cm d ,
+.Cm i ,
+.Cm o ,
+.Cm u ,
+.Cm x ,
 and
-.B X
-conversions, the number of digits to appear after the decimal point for
-.BR e ,
-.BR E ,
+.Cm X
+conversions, the number of digits to appear after the decimal-point for
+.Cm e ,
+.Cm E ,
 and
-.B f
+.Cm f
 conversions, the maximum number of significant digits for
-.B g
+.Cm g
 and
-.B G
+.Cm G
 conversions, or the maximum number of characters to be printed from a
 string for
-.B s
+.Cm s
 conversions.
-.TP 4
-.B \(bu
-The character
-.BR h ,
+.It
+The optional character
+.Cm h ,
 specifying that a following
-.BR d ,
-.BR i ,
-.BR o ,
-.BR u ,
-.BR x ,
+.Cm d ,
+.Cm i ,
+.Cm o ,
+.Cm u ,
+.Cm x ,
 or
-.B X
+.Cm X
 conversion corresponds to a
-.B "short int"
+.Em short int
 or
-.B "unsigned short int"
+.Em unsigned short int
 argument, or that a following
-.B n
+.Cm n
 conversion corresponds to a pointer to a
-.B "short int"
+.Em short int
 argument.
-.TP 4
-.B \(bu
-the character
-.B l
+.It
+The optional character
+.Cm l
 (ell) specifying that a following
-.BR d ,
-.BR i ,
-.BR o ,
-.BR u ,
-.BR x ,
+.Cm d ,
+.Cm i ,
+.Cm o ,
+.Cm u ,
+.Cm x ,
 or
-.B X
-conversion corresponds to a
-.B "long int"
+.Cm X
+conversion applies to a pointer to a
+.Em long int
 or
-.B "unsigned long int"
+.Em unsigned long int
 argument, or that a following
-.B n
+.Cm n
 conversion corresponds to a pointer to a
-.B "long int"
+.Em long int
 argument.
-.TP 4
-.B \(bu
+.It
 The character
-.B L
+.Cm L
 specifying that a following
-.BR e ,
-.BR E ,
-.BR f ,
-.BR g ,
+.Cm e ,
+.Cm E ,
+.Cm f ,
+.Cm g ,
 or
-.B G
+.Cm G
 conversion corresponds to a
-.B "long double"
+.Em long double
 argument (but note that long double values are not currently supported
-by the \s-2VAX\s0 and Tahoe compilers).
-.TP 4
-.B \(bu
-A character which indicates the type of conversion to be applied.
-.PP
-A field width or precision may be an asterisk (`*') instead of a
+by the
+.Tn VAX
+and
+.Tn Tahoe
+compilers).
+.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 *
+instead of a
 digit string.
-In this case an
-.B int
-argument supplies the value.
+In this case, an
+.Em 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.
-.PP
-The conversion characters and their meanings are:
-.TP 4
-.B diouxX
+.Pp
+The conversion specifiers and their meanings are:
+.Bl -tag -width "diouxX"
+.It Cm diouxX
 The
-.B int
+.Em int
 (or appropriate variant) argument is converted to signed decimal
-.RB ( d " and " i ),
+.Pf ( Cm d
+and
+.Cm i ) ,
 unsigned octal
-.RB ( o ),
+.Pq Cm o ,
 unsigned decimal
-.RB ( u ),
+.Pq Cm u ,
 or unsigned hexadecimal
-.RB ( x " and " X )
-notation respectively.  The letters
-.B abcdef
+.Pf ( Cm x
+and
+.Cm X )
+notation.  The letters
+.Cm abcdef
 are used for
-.B x
+.Cm x
 conversions; the letters
-.B ABCDEF
+.Cm ABCDEF
 are used for
-.B X
+.m 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.
-.TP 4
-.B DOU
+.It Cm DOU
 The
-.B "long int"
+.Em long int
 argument is converted to signed decimal, unsigned octal, or unsigned
 decimal, as if the format had been
-.BR ld ,
-.BR lo ,
+.Cm ld ,
+.Cm lo ,
 or
-.B lu
+.Cm lu
 respectively.
 These conversion characters are deprecated, and will eventually disappear.
-.TP 4
-.B eE
+.It Cm eE
 The
-.B double
+.Em double
 argument is rounded and converted in the style
-`[\fB\-\fR]d\fB.\fRddd\fBe\fR\(+-dd' where there is one digit before the
-decimal point and the number after is equal to the precision specification
-for the argument.
-If the precision is missing, 6 digits are given; if the precision is
-explicitly zero, no decimal point appears.
+.Sm off
+.Pf [\-]d Cm \&. No ddd Cm e No \\*(Pmdd
+.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
-.B E
+.Cm E
 conversion uses the letter
-.B E
+.Cm E
 (rather than
-.BR e )
+.Cm e )
 to introduce the exponent.
 The exponent always contains at least two digits; if the value is zero,
 the exponent is 00.
-.TP 4
-.B f
+.It Cm f
 The
-.B double
+.Em double
 argument is rounded and converted to decimal notation in the style
-`[\fB\-\fR]ddd.ddd' where the number of digits after the decimal point
-is equal to the precision.
-If the precision is missing, 6 digits are given; if the precision is
-explicitly 0, no digits and no decimal point are printed.
+.Sm off
+.Pf [-]ddd Cm \&. No 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.
-.TP 4
-.B g
+.It Cm g
 The
-.B double
-argument is printed in style
-.B f
+.Em double
+argument is converted in style
+.Cm f
 or
-.B e
+.Cm e
 (or
-.B E
+.Cm E
 for
-.B G
+.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
-.B e
+.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.
-.TP 4
-.B c
+.It Cm c
 The
-.B int
+.Em int
 argument is converted to an
-.B "unsigned char",
-and the resulting character is printed.
-.TP 4
-.B s
+.Em unsigned char ,
+and the resulting character is written.
+.It Cm s
 The
-.B "char *"
-argument is taken to be a string (character pointer).
-Characters from the string are printed until a null character is reached,
-or until the number of characters indicated by the precision have been
-printed, whichever occurs first; if a precision is given, no null character
-need be present.
-.TP 4
-.B p
+.Dq Em 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.
+.It Cm p
 The
-.B "void *"
-pointer argument is printed in hexadecimal (as if by `%#x' or `%#lx').
-.TP 4
-.B n
+.Dq Em 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
-.B "int *"
+.Dq Em int *
 (or variant) pointer argument.
 No argument is converted.
-.TP 4
-.B %
-Prints a `%'; no argument is converted.
-.PP
+.It Cm %
+A
+.Ql %
+is written. No argument is converted. The complete conversion specification
+is
+.Ql %% .
+.El
+.Pp
 In no case does a non-existent or small field width cause truncation of
 a field; if the result of a conversion is wider than the field width, the
-field is expanded to contain it.
-Similarly, padding takes place only if the specified field width exceeds
-the actual width.
-.PP
-.SH EXAMPLES
+field is expanded to contain the conversion result.
+.Pp
+.Sh EXAMPLES
 .br
 To print a date and time in the form `Sunday, July 3, 10:02',
 where
-.I weekday
+.Em weekday
 and
-.I month
-are pointers to null-terminated strings:
-.RS
-.HP
-.nh
-printf("%s, %s %d, %02d:%.2d", weekday, month, day, hour, min);
-.RE
-.hy
-.PP
-To print
-.if n pi
-.if t \(*p
-to 5 decimals:
-.IP
-printf("pi = %.5f", 4*atan(1.0));
-.PP
+.Em 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:
-.RS
-.nf
-.ta 1i 2i
-.sp
+.Bd -literal -offset indent
 #include <stdio.h>
-#include <varargs.h>
-char *newfmt(va_alist)
-       va_dcl
+#include <stdlib.h>
+#include <stdarg.h>
+char *newfmt(const char *fmt, ...)
 {
-       char *p, *malloc(), *fmt;
-       va_list ap;
-       if ((p = malloc(128)) == NULL)
-               return (NULL);
-       va_start(ap);
-       fmt = va_arg(ap, char *);
-       (void) vsprintf(p, fmt, ap);
-       va_end(ap);
-       return (p);
+               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);
 }
-.RE
-.fi
-.SH "SEE ALSO"
-printf(1), scanf(3)
-.SH BUGS
-The conversion formats `%D', `%O', and `%U' are not standard and
+.Ed
+.Sh SEE ALSO
+.Xr printf 1 ,
+.Xr scanf 3
+.Sh STANDARDS
+The
+.Fn fprintf ,
+.Fn printf ,
+.Fn sprintf ,
+.Fn vprintf ,
+.Fn vfprintf ,
+and
+.Fn vsprintf
+functions
+conform to
+.St -ansiC .
+.Sh HISTORY
+The functions
+.Fn snprintf
+and
+.Fn vsnprintf
+are new to this release.
+.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 `%p' format with zeros (either by the `0'
+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 `#' flag on `%n' and `%p' conversions, as well as other
-nonsensical combinations such as `%Ld', are not standard; such combinations
+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
+.Pp
 Because
-.I sprintf
+.Fn sprintf
 and
-.I vsprintf
+.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
-.I snprintf
+.Fn snprintf
 interface instead.
 Unfortunately, this interface is not portable.