The C <wchar.h> vwscanf() function reads data from stdin, 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.
The multibyte characters of stdin are interpreted as wide characters as if mbrtowc() function is called to translate (using the stream's internal mbstate_t object).
Note: This function is wide character equivalent of
vscanf() function.
Syntax
int vwscanf (const wchar_t* format, va_list vlist );
Parameters
format |
Specify the C wide string that contains a format string. The format string contains a sequence of characters that control how characters extracted from the stream are treated:
- Whitespace characters: any single whitespace character in the format string consumes all available consecutive whitespace characters from the input (determined as if by calling iswspace() in a loop). Note that there is no difference between "\n", " ", "\t\t", or other whitespace in the format string.
- Non-whitespace character, except format specifier (%): each such character in the format string consumes exactly one identical character from the input stream, or causes the function to fail if the next character on the stream does not compare equal.
- Format specifiers: A sub-sequence beginning with % is used to specify the type and format of the data to be retrieved from the stream and stored into the locations pointed by the additional arguments.
A format specifier for vwscanf() follows this prototype:
%[*][width][length]specifier
The following format specifiers are available:
specifier | Description | Characters extracted |
i | Integer | Any number of digits, optionally preceded by a sign (+ or -). Decimal digits assumed by default (0-9), but a 0 prefix introduces octal digits (0-7), and 0x hexadecimal digits (0-f). Signed argument. |
d or u | Decimal integer | Any number of decimal digits (0-9), optionally preceded by a sign (+ or -). d is for a signed argument, and u for an unsigned. |
o | Octal integer | Any number of octal digits (0-7), optionally preceded by a sign (+ or -). Unsigned argument. |
x, X | Hexadecimal integer | Any number of hexadecimal digits (0-9, a-f, A-F), optionally preceded by 0x or 0X, and all optionally preceded by a sign (+ or -). Unsigned argument. |
a, A f, F e, E g, G | Floating point number | A series of decimal digits, optionally containing a decimal point, optionally preceded by a sign (+ or -) and optionally followed by the e or E character and a decimal integer (or some of the other sequences supported by wcstof()).
Implementations complying with C99 also support hexadecimal floating-point format when preceded by 0x or 0X. |
c | Character | The next character. The function reads exactly width characters and stores them in the successive locations of the array passed as argument. No null character is appended at the end. |
s | String of characters | Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence. |
p | Pointer address | A sequence of characters representing a pointer. The particular format used depends on the system and library implementation, but it is the same as the one used to format %p in fwprintf(). |
[characters] | Scanset | Any number of the characters specified between the brackets.
A dash (-) that is not the first character may produce non-portable behavior in some library implementations. |
[^characters] | Negated scanset | Any number of characters none of them specified as characters between the brackets. |
n | Count | No input is consumed.
The number of characters read so far and stored in the pointed location. |
% | % | A % followed by another % matches a single %. |
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:
subs‑specifier | Description |
* | An optional starting asterisk indicates that the data is to be read from the stream but ignored (i.e. it is not stored in the location pointed by an argument). |
width | Specifies the maximum number of characters to be read in the current reading operation (optional). |
length | Modifies the length of the data type. For example - %i is used for signed decimal integer, with ll length sub-specifier it becomes %lli which can be used for long long int data type. Here is the complete list of length sub-specifier. |
|
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 an encoding error occurs while interpreting wide characters, errno is set to EILSEQ.
Example: vwscanf() example
The example below shows the usage of vwscanf() function.
#include <wchar.h>
#include <stdarg.h>
void ScanFormatted ( const wchar_t * format, ... ) {
va_list args;
va_start(args, format);
vwscanf(format, args);
va_end(args);
}
int main () {
int val;
wchar_t c, str[50];
wprintf (L"Enter an integer, a character and a string: ");
ScanFormatted(L"%d %lc %50ls ", &val, &c, str);
wprintf(L"Integer = %d\n", val);
wprintf(L"Character = %lc\n", c);
wprintf(L"String = %ls\n", str);
return 0;
}
The output of the above code will be:
Enter an integer, a character and a string: 10 A London
Integer = 10
Character = A
String = London
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 <wchar.h> Library