vprintf, vfprintf, vsprintf, vdprintf, vsnprintf, vasprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s - print formatted output of a variable argument list
#include <stdio.h> #include <stdarg.h> int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vdprintf(int fildes, const char *format, va_list ap);
int vsprintf(char *s, const char *format, va_list ap);
int vsnprintf(char *s, size_t n, const char *format, va_list ap);
int vasprintf(char **ret, const char *format, va_list ap);
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdarg.h> #include <stdio.h> int vprintf_s(const char *restrict format, va_list ap);
int vfprintf_s(FILE *restrict stream, const char *restrict format, va_list ap);
int vsprintf_s(char *restrict s, rsize_t n, const char *restrict format, va_list ap);
int vsnprintf_s(char *restrict s, rsize_t n, const char *restrict format, va_list ap);
The vprintf(), vfprintf(), vdprintf(), vsprintf(), vsnprintf(), and vasprintf() functions are the same as printf(), fprintf(), dprintf(), sprintf(), snprintf(), and asprintf(), respectively, except that instead of being called with a variable number of arguments, they are called with an argument list as defined in the stdarg.h header. See printf(3C).
The stdarg.h header defines the type va_list and a set of macros for advancing through a list of arguments whose number and types may vary. The argument ap to the vprint family of functions is of type va_list. This argument is used with the <stdarg.h> header file macros va_start(), va_arg(), and va_end() (see stdarg(3EXT)). The EXAMPLES section below demonstrates the use of va_start() and va_end() with vprintf().
The macro va_alist() is used as the parameter list in a function definition, as in the function called error() in the example below. The macro va_start(ap, name), where ap is of type va_list and name is the rightmost parameter (just before . . .), must be called before any attempt to traverse and access unnamed arguments is made. The va_end(ap) macro must be invoked when all desired arguments have been accessed. The argument list in ap can be traversed again if va_start() is called again after va_end(). In the example below, the error() arguments (arg1, arg2, …) are passed to vfprintf() in the argument ap.
The vprintf_s(), vfprintf_s(), vsnprintf_s(), and vsprintf_s() functions are part of the C11 bounds checking interfaces specified in the C11 standard, Annex K. The functions are similar to their respective non-bounds checking functions, except for additional safety checks in the form of explicit runtime-constraints as defined in the C11 standard. See runtime_constraint_handler(3C) and INCITS/ISO/IEC 9899:2011.
Refer to printf(3C).
The vprintf() and vfprintf() functions will fail if either the stream is unbuffered or the stream's buffer needed to be flushed and:
The file is a regular file and an attempt was made to write at or beyond the offset maximum.
Likewise, the vdprintf() function will fail if:
The fildes argument is not a valid file descriptor.
The vprintf_s(), vfprintf_s(), vsprintf_s() and vsnprintf() functions will fail if:
Null pointer is passed.
Size argument is not valid value.
The following demonstrates how vfprintf() could be used to write an error routine:
#include <stdio.h> #include <stdarg.h> . . . /* * error should be called like * error(function_name, format, arg1, …); */ void error(const char *function_name, const char *format, …) { va_list ap; va_start(ap, format); /* print out name of function causing error */ (void) fprintf(stderr, "ERR in %s: ", function_name); /* print out remainder of message */ (void) vfprintf(stderr, format, ap); va_end(ap); (void) abort ; }
See attributes(7) for descriptions of the following attributes:
|
The vprintf(), vfprintf(), vdprintf(), vsprintf(), vsnprintf(), and vasprintf() functions can be used safely in multithreaded applications, as long as setlocale(3C) is not being called to change the locale.
The vprintf_s(), vfprintf_s(), vsprintf_s(), and vsnprintf_s() functions cannot be used safely in a multithreaded application due to the runtime constraint handler. For more information, see the runtime_constraint_handler(3C) man page.
See standards(7) for descriptions of the following standards:
|
The vasprintf() function is modeled on the one that appears in the FreeBSD, NetBSD, and GNU C libraries.
printf(3C), printf_s(3C), vwprintf(3C), stdarg(3EXT), attributes(7), standards(7), runtime_constraint_handler(3C)
The support history for flag characters, length modifiers, and conversion specifiers are the same as for the printf() function. See printf(3C).
The vdprintf(), vprintf_s(), vfprintf_s(), vsprintf_s(), and vsnprintf_s() functions were added to Oracle Solaris in Oracle Solaris 11.4.0.
The vasprintf() function was added to Oracle Solaris in Oracle Solaris 10 8/11 (Update 10).
The vsnprintf() return value when n = 0 was changed in the Solaris 10 release. The change was based on the SUSv3 specification. The previous behavior was based on the initial SUSv2 specification, where vsnprintf() when n = 0 returns an unspecified value less than 1.
The vsnprintf() function was added to Solaris in Solaris 2.5, and backported to patches for Solaris 2.3 & 2.4.
The vprintf(), vfprintf(), and vsprintf() functions have been included in all Sun and Oracle releases of Solaris.