scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
Header: <stdio.h>
Reads data from a variety of sources, interprets it according to format and stores the results into given locations.
# Declarations
int scanf( const char *format, ... );
(until C99)
int scanf( const char *restrict format, ... );
(since C99)
int fscanf( FILE *stream, const char *format, ... );
(until C99)
int fscanf( FILE *restrict stream, const char *restrict format, ... );
(since C99)
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, ...);
(since C11)
int fscanf_s(FILE *restrict stream, const char *restrict format, ...);
(since C11)
int sscanf_s(const char *restrict buffer, const char *restrict format, ...);
(since C11)
# Parameters
stream: input file stream to read frombuffer: pointer to a null-terminated character string to read fromformat: pointer to a null-terminated character string specifying how to read the input...: receiving arguments.
# Notes
Because most conversion specifiers first consume all consecutive whitespace, code such as
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).
# 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:\n"
"i = %d\n"
"x = %f\n"
"str1 = %s\n"
"j = %d\n"
"y = %f\n"
"str2 = %s\n"
"warr[0] = U+%x\n"
"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
}