-.\" 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
.\" .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
.\" .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.