std::vscanf, std::vfscanf, std::vsscanf
在标头
<cstdio>
定义
|
||
int vscanf( const char* format, va_list vlist );
|
(1) | (C++11 起) |
int vfscanf( std::FILE*
stream, const char* format, va_list vlist
);
|
(2) | (C++11 起) |
int vsscanf( const char* buffer, const char* format, va_list vlist
);
|
(3) | (C++11 起) |
从各种源读取数据,按照 format
转译并存储结果到 vlist
所定义的位置。
stream
读取数据。buffer
读取数据。参数
stream | - | 要读取的输入文件流 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 指向要读取的空终止字符串的指针 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 指向指定如何读取输入的空终止字符串的指针。
格式字符串由下列内容组成
下列格式指示符可用:
对于每个异于 所有异于 转换指示符 转换指示符 定宽整数类型(
在每个转换指示符后有一个序列点;这允许存储多个域到同一“池”变量中。 在分析以无数字指数为结尾的不完整浮点值,如以转换指示符 %f 分析 "100er" 时,消耗序列 "100e" (可能为合法浮点数的最长前缀),并导致匹配错误(被消耗序列不能转换成浮点数),而留下 "r" 。某些既存实现不遵守此规则并回滚,通过消耗 "100" 而留下 "er" ,例如 glibc 漏洞 1765 。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vlist | - | 含有接收参数的可变参数列表 |
返回值
成功读取的参数个数,或若出现失败则为 EOF 。
注解
所有这些函数调用 va_arg 至少一次,返回后 arg
的值不确定。这些函数不调用 va_end ,而这必须由调用方进行。
示例
#include <iostream> #include <cstdio> #include <cstdarg> #include <stdexcept> void checked_sscanf(int count, const char* buf, const char *fmt, ...) { va_list ap; va_start(ap, fmt); if(std::vsscanf(buf, fmt, ap) != count) throw std::runtime_error("parsing error"); va_end(ap); } int main() { try { int n, m; std::cout << "Parsing '1 2'..."; checked_sscanf(2, "1 2", "%d %d", &n, &m); std::cout << "success\n"; std::cout << "Parsing '1 a'..."; checked_sscanf(2, "1 a", "%d %d", &n, &m); std::cout << "success\n"; } catch(const std::exception& e) { std::cout << e.what() << '\n'; } }
输出:
Parsing '1 2'...success Parsing '1 a'...parsing error
参阅
从 stdin、文件流或缓冲区读取有格式输入 (函数) |
|
(C++11)
|
使用可变实参列表 打印有格式输出到 stdout、文件流或缓冲区 (函数) |