当前位置: 首页 > news >正文

sscanf解析

sscanf

sscanf()定义于头文件stdio.hsscanf()会将参数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 程序提供了一种从字符数组读取格式化输入的方法,它非常适合解析存储在字符数组中的结构化数据。通过不同的占位符和标志,可以灵活地处理各种类型和格式的输入。在某些复杂的情况下可能需要额外的错误处理和验证逻辑。

http://www.dtcms.com/a/569121.html

相关文章:

  • 中专生实习找什么工作?
  • 车辆车身颜色特征识别
  • 【JUnit实战3_28】第十七章:用 JUnit 5 实测 SpringBoot 项目
  • 摆脱局域网束缚!用 DS File+cpolar 让 NAS 文件随用随取
  • 网站制作费电力行业做的好的招投标网站
  • 百度网址大全网站大全石家庄网页设计培训班
  • 设计模式学习(十二)状态模式
  • shell-基于k8s/docker管理容器、监控模型训练所消耗的最大CPU与最大内存脚本
  • Maven打包时指定输出路径、以时间戳命名包名和路径名,结合IDEA以指令脚本方式动态配置输出目录
  • PortSwigger
  • Doxygen入门指南:从注释到自动文档
  • Docker 部署 Elasticsearch 8.12 + Kibana + Nginx 负载均衡
  • yolo 训练 动态改变类别
  • SQL大表关联优化全攻略
  • 第五章:构建用户界面(UMG) - 游戏内HUD
  • CSS 雪碧图和 SVG 雪碧图的原理和区别
  • 网站底部代码特效邢台网红隧道
  • 网站降权表现营销型公司网站有哪些
  • 评估指标+数据不匹配+贝叶斯最优误差(分析方差和偏差)+迁移学习+多任务学习+端到端深度学习
  • 外国食品优秀设计网站做网站电话销售
  • 构建下一代法律智能助手:需求分析、资源整合与系统设计
  • Oracle AWR案例分析:精准定位SQL执行计划切换的时间点
  • 2025年7月一区SCI优化算法-Logistic-Gauss Circle optimizer-附Matlab免费代码
  • abpVnext 获取token报错,配置文件从sqlerver切换到oracle,再切换回来sqlerver无法获取token
  • 成都哪里有做网站的公司wordpress在本地搭建
  • C++进阶:(四)set系列容器的全面指南
  • 【Java零碎知识点】----- java.util.Random 与 Math.random()
  • 补充内容:YOLOv5损失函数解析+代码阅读
  • 北仑网站建设培训学校游戏开发需要什么学历
  • 高端装备制造提速,紧固件标准化与智能化升级成为行业新焦点