scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
Defined in header <stdio.h>
|
||
(1) | ||
int scanf( const char *format, ... ); |
(until C99) | |
int scanf( const char *restrict format, ... ); |
(since C99) | |
(2) | ||
int fscanf( FILE *stream, const char *format, ... ); |
(until C99) | |
int fscanf( FILE *restrict stream, const char *restrict format, ... ); |
(since C99) | |
(3) | ||
int sscanf( const char *buffer, const char *format, ... ); |
(until C99) | |
int sscanf( const char *restrict buffer, const char *restrict format, ... ); |
(since C99) | |
int scanf_s(const char *restrict format, ...); |
(4) | (since C11) |
int fscanf_s(FILE *restrict stream, const char *restrict format, ...); |
(5) | (since C11) |
int sscanf_s(const char *restrict buffer, const char *restrict format, ...); |
(6) | (since C11) |
Reads data from the a variety of sources, interprets it according to format
and stores the results into given locations.
stream
buffer
. Reaching the end of the string is equivalent to reaching the end-of-file condition for fscanf
- any of the arguments of pointer type is a null pointer
-
format
,stream
, orbuffer
is a null pointer - the number of characters that would be written by %c, %s, or %[, plus the terminating null character, would exceed the second (rsize_t) argument provided for each of those conversion specifiers
- optionally, any other detectable error, such as unknown conversion specifier
- As all bounds-checked functions,
scanf_s
,fscanf_s
, andsscanf_s
are only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including<stdio.h>
.
Contents |
[edit] Parameters
stream | - | input file stream to read from | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | pointer to a null-terminated character string to read from | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | pointer to a null-terminated character string specifying how to read the input.
The format string consists of whitespace characters (any single whitespace character in the format string consumes all available consecutive whitespace characters from the input), non-whitespace multibyte characters except
The following format specifiers are available:
All conversion specifiers other than The conversion specifiers The conversion specifiers The correct conversion specifications for the fixed-width integer types (
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | receiving arguments |
[edit] Return value
[edit] Notes
Because most conversion specifiers first consume all consecutive whitespace, code such as
scanf("%d", &a); scanf("%d", &b);
will read two integers that are entered on different lines (second %d will consume the newline left over by the first) or on the same line, separated by spaces or tabs (second %d will consume the spaces or tabs).
The conversion specifiers that do not consume leading whitespace, such as %c, can be made to do so by using a whitespace character in the format string:scanf("%d", &a); scanf(" %c", &c); // ignore the endline after %d, then read a char
[edit] Example
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <stddef.h> #include <locale.h> int main(void) { int i, j; float x, y; char str1[10], str2[4]; wchar_t warr[2]; setlocale(LC_ALL, "en_US.utf8"); char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水"; /* parse as follows: %d: an integer %f: a floating-point value %9s: a string of at most 9 non-whitespace characters %2d: two-digit integer (digits 5 and 6) %f: a floating-point value (digits 7, 8, 9) %*d: an integer which isn't stored anywhere ' ': all consecutive whitespace %3[0-9]: a string of at most 3 decimal digits (digits 5 and 6) %2lc: two wide characters, using multibyte to wide conversion */ int ret = sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc", &i, &x, str1, &j, &y, str2, warr); printf("Converted %d fields:\ni = %d\nx = %f\nstr1 = %s\n" "j = %d\ny = %f\nstr2 = %s\n" "warr[0] = U+%x warr[1] = U+%x\n", ret, i, x, str1, j, y, str2, warr[0], warr[1]); #ifdef __STDC_LIB_EXT1__ int n = sscanf_s(input, "%d%f%s", &i, &x, str1, (rsize_t)sizeof str1); // writes 25 to i, 5.432 to x, the 9 bytes "thompson\0" to str1, and 3 to n. #endif }
Output:
Converted 7 fields: i = 25 x = 5.432000 str1 = Thompson j = 56 y = 789.000000 str2 = 56 warr[0] = U+df warr[1] = U+6c34
[edit] References
- C11 standard (ISO/IEC 9899:2011):
- 7.21.6.2 The fscanf function (p: 317-324)
- 7.21.6.4 The scanf function (p: 325)
- 7.21.6.7 The sscanf function (p: 326)
- K.3.5.3.2 The fscanf_s function (p: 592-593)
- K.3.5.3.4 The scanf_s function (p: 594)
- K.3.5.3.7 The sscanf_s function (p: 596)
- C99 standard (ISO/IEC 9899:1999):
- 7.19.6.2 The fscanf function (p: 282-289)
- 7.19.6.4 The scanf function (p: 290)
- 7.19.6.7 The sscanf function (p: 291)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.9.6.2 The fscanf function
- 4.9.6.4 The scanf function
- 4.9.6.6 The sscanf function
[edit] See also
(C99)(C99)(C99)(C11)(C11)(C11) |
reads formatted input from stdin, a file stream or a buffer using variable argument list (function) |
gets a character string from a file stream (function) | |
(C99)(C11)(C11)(C11)(C11) |
prints formatted output to stdout, a file stream or a buffer (function) |
C++ documentation for scanf, fscanf, sscanf
|