Previous Page
Next Page

vfprintf, vprintf, vsnprintf, vsprintf

Writes formatted output using a variable argument list object

#include <stdio.h>
#include <stdarg.h>
int vfprintf ( FILE * restrict fp , const char * restrict format ,
              va_list argptr  );
int vprintf ( const char * restrict format , va_list argptr  );
int vsprintf ( char * restrict buffer , const char * restrict format ,
              va_list argptr  );
int vsnprintf ( char * restrict buffer , size_t n ,
               const char * restrict format , va_list argptr  );   (C99)

The functions vfprintf( ), vprintf( ), vsprintf( ), and vsnprintf( ) work in the same way as fprintf( ), printf( ), sprintf( ), and snprintf( ), respectively, except that their last argument, argptr, is a variable-argument list object with type va_list. The program must initialize this object by calling the va_start( ) macro before calling the vfprintf( ), vprintf( ), vsprintf( ), or vsnprintf( ) function, and must call the va_end( ) macro after the function returns. Because these functions use the va_arg( ) macro internally to advance argptr through the argument list, its value is indeterminate after the vfprintf( ), vprintf( ), vsprintf( ), or vsnprintf( ) function call has returned.

The va_start( ), va_arg( ), and va_end( ) macros and the type va_list are declared in the header file stdarg.h.


Like the fprintf( ) and printf( ) functions, vfprintf( ) and vprintf( ), return the number of characters written to the output stream. The function vsprintf( ) returns the number of characters written to the string buffer, not counting the terminator character; and vsnprintf( ) returns the number of characters that would have been written to the string buffer if the parameter n had been sufficiently large, again not counting the terminator character.

Example

// write_log appends a line to the log file associated with the
// FILE pointer fp_log.
// The format string and optional arguments are the same as for printf( ).

void write_log(const char *function_name, unsigned int line_num,
               const char *format_str, ...)
{
  if ( fp_log == NULL)
    return;
  time_t timestamp = time(NULL);
  va_list argptr;
  // Set argptr to the first optional argument:
  va_start( argptr, format_str);

  // First print the timestamp, function name, and line number:
  fprintf( fp_log, "%.8s %s (line %u): ",
                   ctime(&timestamp)+11, function_name, line_num);
  // Then print the rest of the message:
  vfprintf( fp_log, format_str, argptr);

  va_end(argptr);
}

void myFunc( int param)
{
  write_log( _  _func_  _, _  _LINE_  _, "param = %d\n", param);
  /* ... */
}

Calling myFunc( ) in this example with the argument value 777 results in the following log file entry:

13:32:44 myFunc (line 62): param = 777

See Also

va_start( ), va_arg( ), va_copy( ) and va_end( ); fprintf( ), printf( ), sprintf( ), and snprintf( ); vfwprintf( ), vwprintf( ), and vswprintf( )


Previous Page
Next Page