Go to main content

man pages section 3: Basic Library Functions

Exit Print View

Updated: Thursday, June 13, 2019
 
 

vprintf_s(3C)

Name

vprintf, vfprintf, vsprintf, vsnprintf, vasprintf - print formatted output of a variable argument

vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s - print formatted output of a variable argument list with additional safety checks

Synopsis

#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 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);

Description

The vprintf(), vfprintf(), vsprintf(), vsnprintf(), and vasprintf() functions are the same as printf(), fprintf(), 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.

Return Values

Refer to printf(3C).

Errors

The vprintf() and vfprintf() functions will fail if either the stream is unbuffered or the stream's buffer needed to be flushed and:

EFBIG

The file is a regular file and an attempt was made to write at or beyond the offset maximum.

The vprintf_s(), vfprintf_s(), vsprintf_s() and vsnprintf() functions will fail if:

EINVAL

Null pointer is passed.

ERANGE

Size argument is not valid value.

Examples

Example 1 Using vprintf() to write an error routine.

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(char *function_name, 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 ;
}

Attributes

See attributes(7) for descriptions of the following attributes:

ATTRIBUTE TYPE
ATTRIBUTE VALUE
Interface Stability
Committed
MT-Level
See below.
Standard
See below.

The vprintf(), vfprintf(), 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 the standards conformance of vprintf(), vfprintf(), vsprintf(), and vsnprintf(). The vasprintf() function is modeled on the one that appears in the FreeBSD, NetBSD, and GNU C libraries.

See Also

printf(3C), printf_s(3C), stdarg(3EXT), attributes(7), standards(7), runtime_constraint_handler(3C)

Notes

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.