C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- C 风格文件输入/输出
- 输入/输出操纵符
- std::ios_base
- std::basic_osyncstream
- std::clearerr
- std::fopen
- std::fgetc, std::getc
- std::printf, std::fprintf, std::sprintf, std::snprintf
- std::scanf, std::fscanf, std::sscanf
- std::FILE
- std::basic_streambuf
- std::basic_filebuf
- std::basic_stringbuf
- std::strstreambuf
- std::basic_syncbuf
- std::basic_ios
- std::basic_istream
- std::basic_ostream
- std::basic_iostream
- std::basic_ifstream
- std::basic_ofstream
- std::basic_fstream
- std::basic_istringstream
- std::basic_ostringstream
- std::basic_stringstream
- std::istrstream
- std::ostrstream
- std::strstream
- std::streamoff
- std::streamsize
- std::fpos
- std::iostream_category
- std::io_errc
- std::cin, std::wcin
- std::cout, std::wcout
- std::cerr, std::wcerr
- std::clog, std::wclog
- 注释
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
位置:首页 > C++ 参考手册 >输入/输出库 >C 风格文件输入/输出 > std::scanf, std::fscanf, std::sscanf
std::scanf, std::fscanf, std::sscanf
从各种源读取数据,按照 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) |
转换字符序列到整数或浮点值 (函数) |