[Go to CFHT Home Page] Man Pages
Back to Software Index  BORDER=0Manpage Top Level
    vprintf(3S) manual page Table of Contents

Name

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

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

MT-Level

See the NOTES section of this page.

Description

vprintf(), vfprintf(), and vsprintf() are the same as printf(), fprintf(), and sprintf() respectively, except that instead of being called with a variable number of arguments, they are called with an argument list as defined by the <stdarg.h> header.

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 routines 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(5) ). The EXAMPLES section below shows 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, parmN), where ap is of type va_list, and parmN 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 given to vfprintf() in the argument ap.

Return Values

vprintf() and vfprintf() return the number of characters transmitted, or return -1 if an error was encountered.

Examples

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, );
    /* 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 Also

printf(3S) , stdarg(5)

Notes

vprintf(), vfprintf(), and vsprintf() are MT-Safe in multi-thread applications.


Table of Contents