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

sscanf类似于正则表达式的进阶用法

前言

用C++处理字符串时总是很苦恼,作为一种接近于底层的语言,工具函数总觉得不够使,脑子里过一遍也就只能想起strcpystrcatstrlenstrstr等几个常用的字符串处理函数,相比于Lua、Python等解释型语言来说真是少得可怜,其实利用仅有的这几个函数也能处理大部分的问题,只是代码写起来比较麻烦罢了。

今天恰好有个需求,去掉所给字符串前端固定格式的部分,保留后面的内容,这个工作听起来挺容易,只要使用strstr函数就可以搞定,但是如果使用这个函数,我就不得不做一些有效性判断,无法避免的增加了代码行数,有没有办法直接把指定的内容取出来呢?当然可以,这时我想起了sscanf函数,话说这个函数可以支持一定格式的匹配,但是和正则表达式来比的话还差了一大截,所以如果你只是做简单的匹配还没有问题,复杂的操作只能祭出正则表达式这个大杀器了!

用法

函数的声明很简单int sscanf(const char *buffer, const char *format, [ argument ]...);其中最重要的参数就是format,它可以是一个或多个{%[*][width][{h|I|I64|L}]type|' '|'\t'| '\n'|非%符号},其中有一些具体的解释,我摘录在此处:

  1. *也可以用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入,也就是不把此数据读入参数中。
  2. {a|b|c}表示a,b,c中选一,[d]表示可以有d也可以没有d。
  3. width表示读取宽度。
  4. {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
  5. type:这一项比较多,就是%s、%d之类。
  6. 特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。
  7. 未成功匹配返回0 ,否则返回格式化的参数个数。

示例

先来说说我实际遇到的问题,就是要取到类似于[100]test这个字符串里面中括号之后的部分,最后经过试验format的写法应该是"%*[[]%*d%*[]]%s",接下来我们来看看这个sscanf函数的具体用法:

一般使用

int id, level;
sscanf("10|2", "%d|%d", &id, &level);

id = 10, level = 2

取指定长度的字符串

char result[1024] = {0};
sscanf("this is a test!", "%3s", result);

result = thi

取指定字符结尾的字符串

char result[1024] = {0};
sscanf("this is a test!123", "%[^0-9]", result);

result = this is a test!

取/和@之间的字符串

char result[1024] = {0};
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", result);

result = 12DDWDFF

总结

  1. 遇到上述没有提到的用法可以自己先尝试一下,由易入难,不断测试,直到满足需求。
  2. sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式。

相关文章:

  • mysql函数扩展之UDF开发
  • Python实现一个简单的图片爬虫
  • 验证mysql联合索引最左原则
  • Mysql查询时case when语句的使用
  • Vim中简单格式化代码
  • Vim、Xshell、远程终端莫名卡死的原因
  • 关于游戏中仓库类的设计
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • 神秘莫测的时间复杂度
  • 排序算法系列之(三)——略显神秘的快速排序
  • .bat批处理(六):替换字符串中匹配的子串
  • 操作指向类成员的指针需要了解的两个操作符-*和.*
  • VS2015调试dump文件时提示未找到xxx.exe或xxx.dll
  • 结构体sockaddr、sockaddr_in、sockaddr_in6之间的区别和联系
  • 简述TCP三次握手和四次挥手流程
  • 5、React组件事件详解
  • Android开源项目规范总结
  • Asm.js的简单介绍
  • CSS 专业技巧
  • git 常用命令
  • gitlab-ci配置详解(一)
  • Hibernate最全面试题
  • IDEA 插件开发入门教程
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Js基础知识(四) - js运行原理与机制
  • Lucene解析 - 基本概念
  • Material Design
  • PV统计优化设计
  • rabbitmq延迟消息示例
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • uva 10370 Above Average
  • 阿里云应用高可用服务公测发布
  • 初识MongoDB分片
  • 基于遗传算法的优化问题求解
  • 记一次用 NodeJs 实现模拟登录的思路
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端知识点整理(待续)
  • 浅谈web中前端模板引擎的使用
  • 什么是Javascript函数节流?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 移动端 h5开发相关内容总结(三)
  • 源码安装memcached和php memcache扩展
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #laravel 通过手动安装依赖PHPExcel#
  • $.ajax()方法详解
  • (SpringBoot)第二章:Spring创建和使用
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (南京观海微电子)——COF介绍
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ***原理与防范
  • .dwp和.webpart的区别
  • .net core使用RPC方式进行高效的HTTP服务访问