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. Exampletypedef 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( ) |