理解了%[^|]|这个模式就基本能解析复杂字符串了。
这个模式是%s的一个正则表达式方向的进化,本意也是要取字符串,但是是有选择的取。如何选择,就写在[]中。其中的^表示“不取”,不取哪些模式就写在^的后面。
例子中的[^|]就表示不取|,取到|就停止了,最后一个|则对应源串中的|
整体来看,%[^|]|就表示取到|为止(不取这个|)然后跳过|

另外还有更多的取%s的进化,比如%[0-9](只取数字)、%[0-9a-z](取数字或者小写英文字符)、%[0-9.](取数字或者英文句号)。

注意:这种正则表达式的进化只存在于%s的选取,对于%d之类的其他类型不需要。因为这些其他类型只要遇到不符合的字符就会立即停止,%s则可以包含各种字符,所以才需要正则表达式来指导它取哪些不取哪些。

如下面例子中的ip字段的选取,直接用%d即可。(当然后面还要写上|来跳过源串中的|)

例子:

#include <stdlib.h>
#include <stdio.h>#include <debug_macro/my_debug.h>int main()
{char type[32] = {0};char ip[17] = {0};int port = 0;char jsonStr[128] = {0};char *string = "cAgent|10.10.10.1|1234|{Json}";sscanf(string, "%[^|]", type);DEBUG_PRINTF("type: %s\n", type);sscanf(string, "%[^|]|%[^|]", type, ip);DEBUG_PRINTF("type: %s, ip: %s\n", type, ip);sscanf(string, "%[^|]|%[^|]|%d", type, ip, &port);//注意这个port的选取,直接写%d即可DEBUG_PRINTF("type: %s, ip: %s, port: %d\n", type, ip, port);sscanf(string, "%[^|]|%[^|]|%d|%s", type, ip, &port, jsonStr);DEBUG_PRINTF("type: %s, ip: %s, port: %d, jsonStr: %s\n", type, ip, port, jsonStr);return 0;}

运行结果:

[root@localhost195-46 other]# gcc test.c -o test -I ./ -DMY_DEBUG_ON
[root@localhost195-46 other]# ./test
[main:16]type: cAgent
[main:18]type: cAgent, ip: 10.10.10.1
[main:20]type: cAgent, ip: 10.10.10.1, port: 1234
[main:22]type: cAgent, ip: 10.10.10.1, port: 1234, jsonStr: {Json}

sscanf高级用法相关推荐

  1. ATS中用到的sscanf高级用法说明

    ATS使用sscanf函数主要用来解析配置文件,或者提取出要用到的数据类型的值,比较方便,大家可以使用SourceInsight来搜索sscanf用到的地方,这里补充一些sscanf的知识,方便自己更 ...

  2. sscanf高级用法级正则表达式

    sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源. 函数原型: int scanf( const char *format [,argume ...

  3. scanf,sscanf高级用法

    最近遇到了解析配置的问题,用正规表达式感觉大题小做,使用sscanf因只会用基本用法,感觉功能不够,上网搜了下,解析起来不费吹灰之力,代码也很简洁. 原帖出处不详,网上到处是,我做了点修改 名称: s ...

  4. sscanf的高级用法

     sscanf的高级用法(总结) 2012-04-25 18:50:25 分类: C/C++ sscanf(recvbuf,"%*[^/]/%[^ ]s",buf_rev);    ...

  5. sscanf和sprintf的高级用法

    sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大得两个函数 头文件 stdio.h 原型 int sscanf( const char *buffer ...

  6. scanf family API 高级用法

    sscanf是一个很好用的函数,利用它可以从字符串中取出整数.浮点数和字符串等等.它的使用方法简单,特别对于整数和浮点数来说.但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧. 1. ...

  7. sscanf一小用法

    背景:欲从FTP服务器下载一文件,须知其大小,使用SIZE命令无效(该命令在RFC959中未出现,即非标准命令).经测试发现RETR命令返回的信息中包含了文件大小,即字节数,现需要将其从字符串中解析出 ...

  8. vim的高级用法配置以及在系统中如何获取帮助

    vim的高级用法配置以及在系统中如何获取帮助 1 vim的三种模式 1.1 使用方法 1.2 vim模式 2 vim工作的基本配置 2.1 临时设定(set设定) 2.2 永久设定方式 3 搜索 4 ...

  9. Cacti Weathermap 高级用法 (二)

    成都长宽Weathermap实际运用的效果图示例: 这是一个CNC出口的质量监控图. 途中cnc节点(红色)是一个展示图例,TEL节点根据存活状态显示为绿色 TEL节点上面P:47.2ms 是一个,这 ...

最新文章

  1. Spark菜鸟学习营Day5 分布式程序开发
  2. 【组队学习】【30期】时间序列分析
  3. datetime 和 smalldatetime
  4. Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化...
  5. python统计单词出现次数_用python统计单词出现频率
  6. 图论为什么这么难_图论是什么,为什么要关心?
  7. Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序
  8. 成都女孩弃港大全额奖学金,将去北大读马克思,“我对党史和马克思很有感情”!...
  9. 双绞线传输距离_视频监控系统中布线常用传输线缆分类及制作方法
  10. 我构建应用的这十年......
  11. 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)
  12. mz04那智不二越机器人编程_买买买!这些炫酷的机器人已加入进博会“购物车”!...
  13. oracle启动数据库错误
  14. 微积分(二)——曲线积分与曲面积分笔记
  15. 学科03:工程学重要模型
  16. 计算当前时间到午夜零点的时间差——Java(JDK1.8)
  17. Linux系统命令行常识问答2
  18. 背单词App开发日记4
  19. 在线微信公众号调查数据分析报告
  20. Python3.8.5安装教程

热门文章

  1. 【kindle笔记】读书记录-总
  2. Matlab中pickic_中英双语小猪佩奇学英语Picnic野餐
  3. 【天光学术】艺术论文:传统凤鸟图形在博物馆文创产品设计中的运用
  4. WIN7 XP Mode虚拟机无法登陆
  5. C++——NOIP模拟题——猴子
  6. vivo X23:颜值与科技,一个也不能少
  7. Word撰写论文:制表位法对齐公式
  8. 一文吃透何为微服务、网关、服务发现/注册
  9. 情侣私密社交应用小恩爱 PK Pair: 小恩爱相比略胜 但仍待完善
  10. addEventListener与onclick