fscanf_s
scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
在头文件 | ||
---|---|---|
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 scanf_s(const char *restrict format, ... | (until C99) | |
int sscanf( const char *restrict buffer, const char *restrict format, ... | ||
(until 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) | |
从各种来源读取数据,根据其解释并将format
结果存储到给定位置。
1)从中读取数据 stdin
2)从文件流中读取数据 stream
3)从空终止的字符串中读取数据buffer
。到达字符串的末尾等同于达到文件结束条件fscanf
4-6)与(1-3)相同,不同之处在于%c
,%s
和%[
转换说明符每个都需要两个参数(通常的指针和rsize_t
表示接收数组大小的类型值,当使用%c读取时可能为1成一个字符),除了在运行时检测到以下错误并调用当前安装的约束处理函数:
- 指针类型的任何参数都是空指针
由于所有的边界检查功能,scanf_s,fscanf_s,和sscanf_s仅保证可供如果__STDC_LIB_EXT1__由实现所定义,并且如果用户定义__STDC_WANT_LIB_EXT1__的整数常数1,包括之前<stdio.h>。
参数
stream | - | 输入文件流从中读取 |
---|---|---|
buffer | - | 指向以null结尾的字符串读取的指针 |
format | - | 指向以空字符结尾的字符串的指针,指定如何读取输入。 |
返回值
1-3)成功分配的接收参数数量(EOF
如果在分配第一个接收参数之前发生匹配故障,则可能为零),或者在分配第一个接收参数前发生输入故障。
4-6)与(1-3)相同,但是EOF
如果存在运行时约束冲突,也会返回。
注意
由于大多数转换说明符首先消耗所有连续的空白,所以代码如。
scanf("%d", &a
scanf("%d", &b
将读取在不同行上输入的两个整数(第二个%d将使用第一个剩下的换行符)或在同一行上,由空格或制表符分隔(第二个%d将使用空格或制表符)。不使用前导空格的转换说明符(如%c)可以通过在格式字符串中使用空格字符来完成:
scanf("%d", &a
scanf(" %c", &c // ignore the endline after %d, then read a char
例
#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
}
输出:
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
参考
- C11标准(ISO / IEC 9899:2011):