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

最近工作需要,学习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对应的value
inline 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值