C 参考手册
- C 语言
- C 关键词
- 预处理器
- C 标准库头文件
- 类型支持
- 程序支持工具
- 变参数函数
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 算法
- 数值
- 文件输入/输出
- gets, gets_s
- printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
- fopen, fopen_s
- fputc, putc
- fputs
- getchar
- putchar
- FILE
- fpos_t
- stdin, stdout, stderr
- freopen, freopen_s
- fwide
- setbuf
- setvbuf
- fclose
- fflush
- fread
- fwrite
- fgetc, getc
- fgets
- puts
- ungetc
- fgetwc
- fgetws
- fputwc, putwc
- fputws
- getwchar
- putwchar
- ungetwc
- scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s
- wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
- vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
- vwscanf, vfwscanf, vswscanf, vwscanf_s, vfwscanf_s, vswscanf_s
- wprintf, fwprintf, swprintf, wprintf_s, fwprintf_s, swprintf_s, snwprintf_s
- vprintf, vfprintf, vsprintf, vsnprintf, vprintf_s, vfprintf_s, vsprintf_s, vsnprintf_s
- vwprintf, vfwprintf, vswprintf, vwprintf_s, vfwprintf_s, vswprintf_s, vsnwprintf_s
- ftell
- fgetpos
- fseek
- fsetpos
- rewind
- clearerr
- feof
- ferror
- perror
- remove
- rename
- tmpfile, tmpfile_s
- tmpnam, tmpnam_s
- 本地化支持
- 原子操作库
- 线程支持库
- 实验性 C 标准库
- 有用的资源
- 符号索引
- 注释
vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
从各种源读取数据,按照 format
转译并存储结果到 vlist
所定义的位置。
stream
读取数据。buffer
读取数据。抵达字符串结尾等价于 vfscanf
的抵达文件尾条件- 任何指针类型参数为空指针
-
format
、stream
或buffer
为空指针 - %c 、 %s 或 %[ 本会写入的字符数,加上空终止字符,要超过提供给这些转换指定符的第二个( rsize_t )参数
- 可选,任何其他可检测错误,例如未知转换指定符
- 同所有边界检查函数,
vscanf_s, vfscanf_s, vsscanf_s
仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含<stdio.h>
前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。
参数
stream | - | 要读取的输入文件流 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 指向要读取的空终止字符串的指针 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 指向指定读取输入方式的空终止字符串的指针。
格式字符串由下列内容组成
下列格式指定符可用:
对于每个异于 所有异于 转换指定符 转换指定符 定宽整数类型( 在每个转换指定符后有一个序列点;这允许存储多个域到同一“池”变量中。 在分析以无数字指数为结尾的不完整浮点值,如以转换指定符 %f 分析 "100er" 时,消耗序列 "100e" (可能为合法浮点数的最长前缀),并导致匹配错误(被消耗序列不能转换成浮点数),而留下 "r" 。某些既存实现不遵守此规则并回滚,通过消耗 "100" 而留下 "er" ,例如 glibc 漏洞 1765 。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vlist | - | 包含接收参数的变量参数列表 |
返回值
注意
所有这些函数调用 va_arg 至少一次,返回后 arg
的值不确定。这些函数不调用 va_end ,而这必须由调用方进行。
示例
#include <stdio.h> #include <stdbool.h> #include <stdarg.h> bool checked_sscanf(int count, const char* buf, const char *fmt, ...) { va_list ap; va_start(ap, fmt); int rc = vsscanf(buf, fmt, ap); va_end(ap); return rc == count; } int main(void) { int n, m; printf("Parsing '1 2'..."); if(checked_sscanf(2, "1 2", "%d %d", &n, &m)) puts("success"); else puts("failure"); printf("Parsing '1 a'..."); if(checked_sscanf(2, "1 a", "%d %d", &n, &m)) puts("success"); else puts("failure"); }
输出:
Parsing '1 2'...success Parsing '1 a'...failure
引用
- C11 standard (ISO/IEC 9899:2011):
- 7.21.6.9 The vfscanf function (p: 327)
- 7.21.6.11 The vscanf function (p: 328)
- 7.21.6.14 The vsscanf function (p: 330)
- K.3.5.3.9 The vfscanf_s function (p: 597-598)
- K.3.5.3.11 The vscanf_s function (p: 599)
- K.3.5.3.14 The vsscanf_s function (p: 602)
- C99 standard (ISO/IEC 9899:1999):
- 7.19.6.9 The vfscanf function (p: 293)
- 7.19.6.11 The vscanf function (p: 294)
- 7.19.6.14 The vsscanf function (p: 295)
参阅
(C11)(C11)(C11) |
从stdin、文件流或缓冲区读取格式化输入 (函数) |
(C99)(C11)(C11)(C11)(C11) |
打印格式化输出到stdout、文件流或缓冲区 使用可变参数列表 (函数) |