sscanf解析
sscanf
sscanf()定义于头文件stdio.h。sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。
声明
int sscanf(const char *str, const char * format, ...);
参数
- str -- 这是 C 字符串,是函数检索数据的源。
注意:确保str字符串的末尾位'\0'
- format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。format 说明符形式为 [=%[*][width][length]specifiers]
支持集合操作:
- %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
- %[aB’] 匹配a、B、'中一员,贪婪性。
- %[^a] 匹配非a的任意字符,贪婪性。
- %*[^=] 匹配=之前的字符串并跳过 “=”。
注:集合操作的存储格式只能为char*或wchar_t*,即不能用%[0-9]接收并存储为int*,只能操作字符串
- 附加参数 -- 这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。
返回值
- 如果成功,该函数返回成功匹配和赋值的个数。
- 如果到达文件末尾或发生读错误,则返回 EOF(-1)。
sscanf()示例
一、基础类型解析
1. 提取整数和浮点数
int year, month; float price; sscanf("2025 3.14", "%d %f", &year, &price); // year=2025, price=3.14说明:%d 匹配整数,%f 匹配浮点数,空格分隔数据
2. 解析日期字符串int y, m, d; sscanf("2025-07-04", "%d-%d-%d", &y, &m, &d); // y=2025, m=7, d=4说明:分隔符 - 需与输入严格匹配
二、集合操作
3. 取遇到空格为止的字符串char buf[20]; sscanf("Hello World", "%[^ ]", buf); // buf="Hello"说明:%[^ ] 匹配非空格字符,遇到空格停止
4. 仅提取数字和小写字母
char data[20]; sscanf("123abcDEF", "%[0-9a-z]", data); // data="123abc"说明:%[0-9a-z] 仅匹配数字和小写字母,遇到 D(大写)停止
5. 取到遇到大写字母为止
char text[20]; sscanf("test123ABC", "%[^A-Z]", text); // text="test123"说明:%[^A-Z] 匹配非大写字母,遇到 A 停止
6. 过滤前缀后提取中间内容
char id[20]; sscanf("ID:ABC123;Status:OK", "%*[^:]:%[^;]", id); // id="ABC123"说明:
%*[^:]:跳过 ID: 前的所有字符;
%[^;]:提取直到分号 ; 的内容
7. 分割逗号分隔的字符串
char s1[10], s2[10]; sscanf("222,333", "%[^,],%[^,]", s1, s2); // s1="222", s2="333"说明:%[^,] 匹配非逗号字符,用于 CSV 解析
8. 跳过不需要的数据
char word[10]; sscanf("Hello World", "%*s %s", word); // word="World"说明:%*s 跳过第一个字符串 Hello
9. 限制字符串读取长度(防溢出)
char name[5]; sscanf("JohnDoe25", "%4s", name); // name="John"说明:%4s 确保只读 4 字符,避免缓冲区溢出
10. 提取固定格式中的多段数据
char user[20], host[20]; sscanf("user:admin@host.com", "%[^@]@%[^.]", user, host); // user="user:admin", host="host"说明:%[^@] 取 @ 前内容,%[^.] 取 . 前内容
总结
sscanf() 函数为 C 程序提供了一种从字符数组读取格式化输入的方法,它非常适合解析存储在字符数组中的结构化数据。通过不同的占位符和标志,可以灵活地处理各种类型和格式的输入。在某些复杂的情况下可能需要额外的错误处理和验证逻辑。

