c函数sscanf的高级技巧(二)
第一篇文章 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的高级技巧(二)相关推荐
- c函数sscanf的高级技巧
在解析url过程中,有时需要非常简单的分解,这时候可以使用几种方法 例如 const char *url = "http://192.168.1.144:1551/AVTransport/c ...
- 【Python】函数图像绘制:二维图像、三维图像、散点图、心形图
[Python]函数图像绘制:二维图像.三维图像.散点图.心形图 所有需要用的包 二维图像 三维图像 散点图绘制 心形图绘制 所有需要用的包 from mpl_toolkits.mplot3d imp ...
- C语言函数sscanf:从一个字符串中读进与指定格式相符的数据
转载自:http://www.aiseminar.cn/html/07/t-407.html C的split string函数--sscanf sscanf 名称: sscanf() - 从一个字符串 ...
- Linux Shell高级技巧(二)
七.非直接引用变量: 在Shell中提供了三种为标准(直接)变量赋值的方式: 1. 直接赋值. 2. 存储一个命令的输出. 3. 存储某类型计算的结果. ...
- 算法013:二维数组中的查找-在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断中是否存在
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.示例: 现有 ...
- MATLAB用fwind2函数设计近似圆对称二维带通滤波器
%用fwind2函数设计近似圆对称二维带通滤波器 %通带频率为[0.1 0.5] %期望带通频率响应创建矩阵Hd %用freqspace函数创建频率范围向量f1和f2. [f1,f2] = freqs ...
- 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)
系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...
- php二次跳转,discuz二次开发笔记(二)------跳转函数运用,discuz二次开发_PHP教程...
discuz二次开发笔记(二)------跳转函数运用,discuz二次开发 前几天在增加修改功能时,突然用到一个提示函数,有点不理解,看了他的由来后果断做下笔记,感觉这在以后的开发中肯定还是要用的上 ...
- c函数strstr和sscanf组合高级技巧
需求 上一章我们解析完了upnp协议中的http头部获取了xml文件的地址,使用http协议我们再次获取xml文件后需要解析xml,我们最害怕的就是引入一个又一个库,事实上,libupnp就引入了很多 ...
最新文章
- 工作中一些代码优化的地方
- 脑机接口新应用,利用深度学习对无声语音信号解码
- 2012年河南省普通高校招生本科一批院校 平行投档分数线(理科)
- mysql 最大并发连接数
- 安装驱动器于当前运行的windows驱动器不能相同_如何预防硬盘故障?5个迹象表明硬盘驱动器即将故障...
- sudo with no password
- 最简单的基于librtmp的示例:发布H.264(H.264通过RTMP发布)
- Codeforces 478B 6thweek contest_B
- python常用字符串处理函数_Python第10课:常用的字符串处理函数
- matlab unicode,MATLAB中的汉字编码
- python流处理框架_Python操作分布式流处理系统Kafka
- 微云笔记控制脚本实例:远程控制脚本开关
- 新鲜出炉 | 2019届互联网校招本科薪酬清单
- 推荐一款我私藏已久的串口示波神器
- NXP RT1052 eFlexPWM—灵活的增强型 PWM
- 程序员与颈椎病(三):颈椎病终极解决办法
- 如何给宝宝取一个高雅有内涵的名字
- 传统与现代的碰撞——脉学与HRV
- VMware 三种网络模式
- CDH5.7.6-CentOS6安装