第一篇文章 c函数sscanf高级技巧

需求

解析特定json,而不引入特定的库,如字符串

json字符串1"{\"ip\": [\"http://192.168.0.103:25826/description.xml\", \"http://192.168.0.112:1283/\"]}";json字符串2"[{\"ip\":\"http://192.168.0.103:25826/description.xml\",\"fname\" :\"Living Room 1_5336_HiDMR\"}, { \"ip\":\"http://192.168.0.112:1283/\",\"fname\" : \"涔愭挱鎶曞睆(Mr.Z)\" }]"

第一个是一个名为ip的数组 ,第二个是名为ip和fname的数组,我们使用方法,去除里面的空格

void remov_space(const char *body, char *newbody)
{//引号,冒号,前后的空格去除size_t len = strlen(body);char * pos = (char *)body;char * get = (char *)newbody;//while (*pos++ == ' ');for (size_t i = 0; i < len; i++){if (*(pos) != ' ')*(get++) = *(pos);pos++;}*get = '\0';
}

为字符串1定义函数

bool analyselist(const char *body)
{char *pos = (char*)body;if (*pos == '{')pos++;char buffer[1024];if (sscanf(pos, "\"ip\":[%[^]]]}", buffer) == 1){cout<<buffer<<endl;return true;}return false;
}
const char * x = "{\"ip\": [\"http://192.168.0.103:25826/description.xml\",\"http://192.168.0.112:1283/\"]}";
int main()
{char buffer[1024];char body[1024];remov_space(x, body);char *pos = &body[0];pos++;analyselist(&body[0]);
}


找到了json字符串的数组内容,接下去就比较简单了,分割逗号就行

为字符串2 定义函数

该函数查到到有逗号的地方,并且跳过对象和数组的符号,如[ ,{

char *searchpos(const char *body)
{char *pos = (char*)body;if (*pos == '[')pos++;if (*pos == '{')pos++;char *start = pos;while (*pos++ != ',');if (*pos == '{')pos++;return pos;
}
const char * y = "[{\"ip\":\"http://192.168.0.103:25826/description.xml\",\"fname\" :\"Living Room 1_5336_HiDMR\"}, { \"ip\":\"http://192.168.0.112:1283/\",\"fname\" : \"涔愭挱鎶曞睆(Mr.Z)\" }]";
int main()
{remov_space(y, body);pos = &body[0]; // &buffer[0];const char *end = &body[0] + strlen(body);pos += 2;while (pos < end){sscanf(pos, "\"ip\":%[^,]", buffer);cout << buffer << endl;pos = searchpos(pos);//cout << pos << endl;sscanf(pos, "\"fname\":%[^}]", buffer);cout << buffer << endl;pos = searchpos(pos);}
}

其他

若字符串已经获取,获得像
const char * a = ““ip”:“xxxxx””;
const char * b = ““fname”:“ddddddd””;
里面的内容 xxxxx 和 ddddddd


void get_kv(const char *bodyip, const char *bodyfname, string &ipout, string &fnameout)
{char tmp[64];if (sscanf(bodyip, "\"ip\":\"%[^\"]", tmp) == 1)ipout = tmp;if (sscanf(bodyfname, "\"fname\":\"%[^\"]", tmp) == 1)fnameout = tmp;
}
int main()
{const char * a = "\"ip\":\"xxxxx\"";const char * b = "\"fname\":\"ddddddd\"";string a1, b1;get_kv(a, b, a1, b1);cout << a1 << " " << b1 << endl;return 0;
}


需要截取固定长度,可以加上%n,这种模式来截取需要的字符

bool AnalyseList(const char *body)
{//{"ip":["http://192.168.0.103:25826/description.xml", "http://192.168.0.112:1283/"]}char buffer[128];if (sscanf(body, "{\"ip\":%9[^,]", buffer) == 1){printf(buffer);}return true;
}

总结

使用sscanf和c的计算结合,我们可以解析很多我们需要解析的字符串,如json,如果足够简单,没有必要引入json的库,多写一写,想一想,逻辑、数据结构、算法就会慢慢进入我们的视野

c函数sscanf的高级技巧(二)相关推荐

  1. c函数sscanf的高级技巧

    在解析url过程中,有时需要非常简单的分解,这时候可以使用几种方法 例如 const char *url = "http://192.168.1.144:1551/AVTransport/c ...

  2. 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图

    [Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...

  3. C语言函数sscanf:从一个字符串中读进与指定格式相符的数据

    转载自:http://www.aiseminar.cn/html/07/t-407.html C的split string函数--sscanf sscanf 名称: sscanf() - 从一个字符串 ...

  4. Linux Shell高级技巧(二)

    七.非直接引用变量: 在Shell中提供了三种为标准(直接)变量赋值的方式:       1. 直接赋值.       2. 存储一个命令的输出.       3. 存储某类型计算的结果.       ...

  5. 算法013:二维数组中的查找-在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断中是否存在

    题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.示例: 现有 ...

  6. MATLAB用fwind2函数设计近似圆对称二维带通滤波器

    %用fwind2函数设计近似圆对称二维带通滤波器 %通带频率为[0.1 0.5] %期望带通频率响应创建矩阵Hd %用freqspace函数创建频率范围向量f1和f2. [f1,f2] = freqs ...

  7. 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)

     系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...

  8. php二次跳转,discuz二次开发笔记(二)------跳转函数运用,discuz二次开发_PHP教程...

    discuz二次开发笔记(二)------跳转函数运用,discuz二次开发 前几天在增加修改功能时,突然用到一个提示函数,有点不理解,看了他的由来后果断做下笔记,感觉这在以后的开发中肯定还是要用的上 ...

  9. c函数strstr和sscanf组合高级技巧

    需求 上一章我们解析完了upnp协议中的http头部获取了xml文件的地址,使用http协议我们再次获取xml文件后需要解析xml,我们最害怕的就是引入一个又一个库,事实上,libupnp就引入了很多 ...

最新文章

  1. 工作中一些代码优化的地方
  2. 脑机接口新应用,利用深度学习对无声语音信号解码
  3. 2012年河南省普通高校招生本科一批院校 平行投档分数线(理科)
  4. mysql 最大并发连接数
  5. 安装驱动器于当前运行的windows驱动器不能相同_如何预防硬盘故障?5个迹象表明硬盘驱动器即将故障...
  6. sudo with no password
  7. 最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)
  8. Codeforces 478B 6thweek contest_B
  9. python常用字符串处理函数_Python第10课:常用的字符串处理函数
  10. matlab unicode,MATLAB中的汉字编码
  11. python流处理框架_Python操作分布式流处理系统Kafka
  12. 微云笔记控制脚本实例:远程控制脚本开关
  13. 新鲜出炉 | 2019届互联网校招本科薪酬清单
  14. 推荐一款我私藏已久的串口示波神器
  15. NXP RT1052 eFlexPWM—灵活的增强型 PWM
  16. 程序员与颈椎病(三):颈椎病终极解决办法
  17. 如何给宝宝取一个高雅有内涵的名字
  18. 传统与现代的碰撞——脉学与HRV
  19. VMware 三种网络模式
  20. CDH5.7.6-CentOS6安装

热门文章

  1. SQL Server 2022 DataSheet
  2. 马斯克又一语双关 引用猫王金曲威胁直接向推特股东发要约收购?
  3. 苹果高管:M1芯片iPad Air是为内容创作者和学生等设计
  4. 微信支付携手云闪付APP上线支付立减新优惠
  5. Redmi K50 Pro未发先火 卢伟冰:压力好大
  6. 苹果允许员工公开讨论薪资引热议...
  7. 苹果蜂窝网络版iPad mini 6不支持毫米波5G
  8. 英伟达正寻求欧盟批准其收购Arm
  9. 一个德国设计奖,怎么就成了中国品牌的财富密码
  10. 贾跃亭的惩罚来了!就这??