| 
 Reads formatted data using a variable argument list 
#include <stdio.h>
#include <stdarg.h>
int vfscanf ( FILE * restrict fp , const char * restrict format ,
             va_list argptr  );
int vscanf ( const char * restrict format , va_list argptr  );
int vsscanf ( char * restrict buffer , const char * restrict format ,
             va_list argptr  );
The functions vfscanf( ), vscanf( ), and vsscanf( ) work in the same way as fscanf( ), scanf( ), and sscanf( ), respectively, except that their final 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 vfscanf( ), vscanf( ), or vsscanf( ) function, and must call the va_end( ) macro after the function returns. Because these functions use the va_arg( ) macro internally to advance the pointer through the argument list, its value is indeterminate after the vfscanf( ), vscanf( ), or vsscanf( ) function call has returned. 
 Like the fscanf( ), scanf( ), and sscanf( ) functions, vfscanf( ), vscanf( ), and vsscanf( ) return the number of input items that have been assigned to variables referenced by elements of the argument list. Example
typedef struct {
  char lastname[20];
  char firstname[20];
  int dob_month;
  int dob_day;
  int dob_year;
} person;
person employee;
int read_person( char *lname, char *fname, ... )
// As variable arguments (...) use NULL
// or three int pointers (month, day, year).
{
  va_list args;
  int count;
  printf( "Enter the last name and first name (Example: Smith, Sally)\n" );
  count = scanf( "%[^,], %[^\n]", lname, fname );   // Read the name.
  va_start( args, fname);   // Initialize args to start with the argument
                            // that follows fname in the function call.
  if ( count == 2 && va_arg(args, int*) != NULL )
  {
    va_end( args);
    va_start( args, fname);  // Initialize args again.
    printf( "Enter the date of birth. (Example: 9/21/1962)\n");
    count += vscanf( "%d/%d/%d", args );        // Read date of birth.
  }
#ifdef DEBUG
  fprintf( stderr, "Read %d fields.\n", count);
#endif // def DEBUG
  va_end( args );
  return count;
}
int main( )
{
  person *pEmployee = &employee;
  int result;
  result = read_person( pEmployee->lastname,
                        pEmployee->firstname,
                        &pEmployee->dob_month,
                        &pEmployee->dob_day,
                        &pEmployee->dob_year );
#ifdef DEBUG
  fprintf( stderr, "Fields read: %s, %s; born %d-%d-%d\n",
           pEmployee->lastname,
           pEmployee->firstname,
           pEmployee->dob_month,
           pEmployee->dob_day,
           pEmployee->dob_year );
#endif // def DEBUG
}
See Alsova_start( ), va_arg( ), va_copy( ) and va_end( ); fscanf( ), scanf( ), and sscanf( ); vfwscanf( ), vwscanf( ), and vswscanf( ) |