c语言解析类似json类型的字符串

来源:互联网 发布:写作软件app 编辑:程序博客网 时间:2024/05/29 02:35

最近工作需要,学习C语言,写一个数据解析的脚本,最后终于有点眉目了,记录下劳动成果吧!因为基础很差,所以,仅供参考!

这是自己编的一个数据,一会会上传原文本云盘地址


这个解析主要是两个函数,分为

1、取key和key的地址——>getTitle()

2、根据第一步获取对应key的value——>getTitleInfo()


getTitle():

//获取key的值以及地址inline void getTitle(char *str){char tit[MAX_NAS_NUM], val[MAX_NAS_NUM];char *a = 0, *b = 0, *c = 0;char *ptr = NULL, *ptr2 = NULL, *ptr3 = NULL;int i = 0, k = 0;while (a = strstr(str, "{")) {bzero(tit, sizeof(tit));bzero(val, sizeof(val));if (i == 0) {i = 1;strncpy(tit, str, a - str);string_replace_char(tit, '"', ' ');string_replace_char(tit, ':', ' ');string_trim_rn(tit);printf("tit:%s\n", tit);getTitleInfo(str, tit, val);printf("val:\n%s\n", val);str = a;} else {b = a + 1;for (ptr = b; *b; b++) {if (*b == '{') {ptr = b;strncpy(tit, a + 1, ptr - a - 1);string_replace_char(tit, '"', ' ');string_replace_char(tit, ':', ' ');string_trim_rn(tit);printf("tit:%s\n", tit);getTitleInfo(a, tit, val);printf("val:\n%s\n", val);str = ptr;break;}if (*b == '}') {c = b;ptr = b + 1;for (ptr2 = ptr; *ptr; ptr++) {if (*ptr == '{') {ptr2 = ptr;strncpy(tit, c + 2, ptr2 - c - 2);string_replace_char(tit, '"', ' ');string_replace_char(tit, ':', ' ');string_trim_rn(tit);printf("tit:%s\n", tit);getTitleInfo(c, tit, val);printf("val:\n%s\n", val);str = ptr2;break;}if (*ptr == '}') {ptr2 = ptr + 2;if (ptr3 = strstr(ptr2, "{")){strncpy(tit, ptr2, ptr3 - ptr2);string_replace_char(tit, '"', ' ');string_replace_char(tit, ':', ' ');string_trim_rn(tit);printf("tit:%s\n", tit);getTitleInfo(ptr2, tit, val);printf("val:\n%s\n", val);str = ptr3;break;} else {str = ptr2;break;}}}break;}}}}return;}

根据两个大括号的位置,取中间的key,然后发给getTitleInfo()这个函数去解析。


getTitleInfo():

//获取key对应的valueinline void getTitleInfo(char *str, char *title, char *info) {char *first = 0, *a = 0, *end = 0, *ptr = 0;int len = strlen(title), i = 0, k = 0;a = strstr(str, title);for (ptr = a; *a; a++) {if (*a == '{') {if (i == 0) {ptr = a;}i++;}if (*a == '}') {break;}}k = i;first = ptr;//printf("first:\n%s\n", first);for (end = ptr; *ptr; ptr++) {if (*ptr == '{') {k--;}if (*ptr == '}') {k++;}//printf("k:\n%d\n", k);if (k == i) {end = ptr;//printf("end:\n%s\n", end);break;}}//printf("end:\n%s\n", end);//printf("a:\n%s\n", a);strncpy(info, first + 1, end - first - 1);return;}

判断这个key,刚开始对应的 { 有几个,记为i个,然后把i赋值给k,从头开始,

当有 { 时,k--,

    有 } 时,k++,

当k == i时,上下位置对应,取这之间的值,就是所谓的key对应的value。


好啦,大体就是这样,代码和数据样本都上传到了云盘上,大家自己看下吧!(*^__^*) 嘻嘻……

地址:

http://pan.baidu.com/s/1i5ggIzF

原创粉丝点击