C <stdio.h> - vsscanf() Function
The C <stdio.h> vsscanf() function reads data from null-terminated character string (C string) buffer, interprets it according to parameter format and stores the results into the locations pointed by the elements in the variable argument list identified by vlist.
Internally, the function retrieves arguments from the list identified by vlist as if va_start was used on it, and thus the state of vlist is likely altered by the call.
In any case, vlist should have been initialized by va_start at some point before the call, and it is expected to be released by va_end at some point after the call.
Syntax
int vsscanf ( const char* buffer, const char * format, va_list vlist );
Parameters
buffer |
Specify the pointer to a null-terminated character string (C string) to read from. | |||||||||||||||||||||||||||||||||||||||||||||||
format |
Specify the format string. The format string contains a sequence of characters that control how characters extracted from the stream are treated:
A format specifier for vsscanf() follows this prototype: %[*][width][length]specifier The following format specifiers are available:
Except for n, at least one character shall be consumed by any specifier. Otherwise the match fails, and the scan ends there. Additional format values can be placed between the % and the specifier (also known as sub-specifier), which are as follows:
| |||||||||||||||||||||||||||||||||||||||||||||||
vlist |
Specify a variable argument list containing the receiving arguments initialized with va_start. |
Return Value
Returns number of receiving arguments successfully assigned (which may be zero in case a matching failure occurred before the first receiving argument was assigned), or EOF if input failure occurs before the first receiving argument was assigned.
If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof() or ferror()). And, if either happens before any data could be successfully read, EOF is returned.
If a multibyte character encoding error occurs while interpreting wide characters, errno is set to EILSEQ.
Example: vsscanf() example
The example below shows the usage of vsscanf() function.
#include <stdio.h> #include <stdarg.h> void ScanFormatted ( const char * str, const char * format, ... ) { va_list args; va_start(args, format); vsscanf(str, format, args); va_end(args); } int main () { char mystr [] = "John 25 3000"; char name [20]; int age, salary; ScanFormatted(mystr, "%s %i %i", name, &age, &salary); printf("%s is %i years old and earns %i dollars.\n", name, age, salary); return 0; }
The output of the above code will be:
John is 25 years old and earns 3000 dollars.
Example: using * sub-specifier
Consider one more example where sub-specifier * is used to ignore the data while using this function.
#include <stdio.h> #include <stdarg.h> void ScanFormatted ( const char * str, const char * format, ... ) { va_list args; va_start(args, format); vsscanf(str, format, args); va_end(args); } int main () { char mystr [] = "John => 25 => 3000"; char name [20]; int age, salary; ScanFormatted(mystr, "%s %*s %i %*s %i", name, &age, &salary); printf("%s is %i years old and earns %i dollars.\n", name, age, salary); return 0; }
The output of the above code will be:
John is 25 years old and earns 3000 dollars.
Length sub-specifier
Specifiers | |||||||
---|---|---|---|---|---|---|---|
length | d i | u o x X | f F e E g G a A | c s [ ] [^] | p | n | |
(none) | int* | unsigned int* | float* | char* | void** | int* | |
hh | signed char* | unsigned char* | signed char* | ||||
h | short int* | unsigned short int* | short int* | ||||
l | long int* | unsigned long int* | double* | wchar_t* | long int* | ||
ll | long long int* | unsigned long long int* | long long int* | ||||
j | intmax_t* | uintmax_t* | intmax_t* | ||||
z | size_t* | size_t* | size_t* | ||||
t | ptrdiff_t* | ptrdiff_t* | ptrdiff_t* | ||||
L | long double* |
See <cinttypes> for the specifiers for extended types.
❮ C <stdio.h> Library