std::scanf, std::fscanf, std::sscanf
在标头 <cstdio> 定义
|
||
int scanf( const char* format, ... ); |
(1) | |
int fscanf( std::FILE* stream, const char* format, ... ); |
(2) | |
int sscanf( const char* buffer, const char* format, ... ); |
(3) | |
从各种源读取数据,按照 format
转译并存储结果于给定位置。
stream
读数据buffer
读数据参数
stream | - | 读取来源的文件流 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 指向读取数据来源的空终止字符串 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | 指向指定如何读取输入的空终止字符串的指针。
格式字符串由下列内容组成
下列格式指示符可用:
对于每个异于 所有异于 转换指示符 转换指示符 定宽整数类型( 在每个转换指示符后有一个序列点;这允许存储多个域到同一“池”变量中。 在分析以无数字指数为结尾的不完整浮点值,如以转换指示符 %f 分析 "100er" 时,消耗序列 "100e" (可能为合法浮点数的最长前缀),并导致匹配错误(被消耗序列不能转换成浮点数),而留下 "r" 。某些既存实现不遵守此规则并回滚,通过消耗 "100" 而留下 "er" ,例如 glibc 漏洞 1765 。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | 接收的参数 |
返回值
成功赋值的参数数(在首个参数赋值前发生匹配失败的情况下可为零),或若在赋值首个接收的参数前输入失败则为 EOF 。
注解
因为大多数转换指示符首先消耗所有连续空白符,如下代码
std::scanf("%d", &a); std::scanf("%d", &b);
会读取输入于不同行(第二个 %d 会消耗第一个剩下的换行符)或同一行中为空格或制表符所分隔的(第二个 %d 会消耗空格或制表符)二个整数。
不消耗前导空白符的转换指示符,如 %c ,可通过在格式化字符串中用空白符使得它这么做:std::scanf("%d", &a); std::scanf(" %c", &c); // 忽略 %d 后的换行符,然后读一个 char
示例
#include <iostream> #include <clocale> #include <cstdio> int main() { int i, j; float x, y; char str1[10], str2[4]; wchar_t warr[2]; std::setlocale(LC_ALL, "en_US.utf8"); char input[] = u8"25 54.32E-1 Thompson 56789 0123 56ß水"; // 按如下分析: // %d :整数 // %f :浮点值 // %9s :至多 9 个非空白字符的字符串 // %2d :二位整数(数字 5 与 6 ) // %f :浮点值(数字 7 、 8 、 9 ) // %*d 不存储于任何位置的整数 // ' ' :所有连续空白符 // %3[0-9] :至多 3 位数字的字符串(数字 5 与 6 ) // %2lc :二个宽字符,用多字节到宽转换 int ret = std::sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc", &i, &x, str1, &j, &y, str2, warr); std::cout << "Converted " << ret << " fields:\n" << "i = " << i << "\nx = " << x << '\n' << "str1 = " << str1 << "\nj = " << j << '\n' << "y = " << y << "\nstr2 = " << str2 << '\n' << std::hex << "warr[0] = U+" << warr[0] << " warr[1] = U+" << warr[1] << '\n'; }
输出:
Converted 7 fields: i = 25 x = 5.432 str1 = Thompson j = 56 y = 789 str2 = 56 warr[0] = U+df warr[1] = U+6c34
参阅
(C++11)(C++11)(C++11) |
使用可变实参列表 从 stdin、文件流或缓冲区读取有格式输入 (函数) |
从文件流获取字符串 (函数) | |
(C++11) |
打印有格式输出到 stdout、文件流或缓冲区 (函数) |
(C++17) |
转换字符序列到整数或浮点值 (函数) |