最近需要把算法转成C语言,C语言没怎么用过,就大学公共课学过,好久了,忘得差不多了。感觉自己高级语言用的很熟,所以C语言看了点基础就开始转,然后遇到了一个坑,摔死我了。不说废话,进入主题。(以下是思想过程)
我调用别人的第三方库,生成xml类型字符串,我需要进行解析。其实挺简单的,对于linux系统来说,使用libxml就可以轻松搞定。问题是,我是win10,然后就上网查呀,又得下载libxml包,又缺libiconv,后者还没有win,得自己编译一个win版的。真正编译完后,又告诉你缺少zlib1.dll包,我不知道我是怎么坚持下来的。心想妈蛋,大不了不用三方解析包,我整个正则也能搞定。然后一查,这个C还没个什么标准,说这个标准有regex.h,说那个标准没有,卧槽,我是不了解C,我反正用的是Virsual studio.这两条路都给我都堵死了,那没办法了,我就不信用指针用最原始的办法还搞不定(说实话,C语言对于字符串截取这里做的真是太差了,高级语言用惯了,底层的语言用起来真是麻烦)。所以写了个简易版的解析,我就按公司的业务,走了三级标签:<root><confidence></confidence><result><confidence>.....这个层级关系.
/* 第一个参数是要分析的xml格式字符串。 第二个参数是你不得不定位的节点,正如上面说的,要哪个节点下面的子节点 第三个参数是你要的内容左侧的节点<confidence> 同上,不过是右侧</confidence> */ void getElement(char* origin_str,char* root_elm,char* target_elm_start,char* target_elm_end) { const char* result = origin_str; const int origin_len = strlen(origin_str); int* final_result; while ((result = strstr(result,root_elm)) != NULL) { int c1_len = 0; int c2_len = 0; char* con1 = result; while ((con1 = strstr(con1,target_elm_start)) != NULL) { c1_len = strlen(con1); char* con2 = con1; while ((con2 = strstr(con2,target_elm_end)) != NULL) { c2_len = strlen(con2); final_result = (int*)calloc(c1_len - c2_len,sizeof(int)); break; } strncpy(final_result,con1 + strlen(target_elm_start),c1_len - c2_len - strlen(target_elm_start)); final_result[strlen(final_result)] = '\0'; break; } break; } printf("%s\n",final_result); }程序很简单,不过用win真的很糟心,还没办法,很多公司开发出来的工具包都是VS开发的,你要是换的话得各种改,烦,留个教训吧,希望能帮到遇到这种情况的朋友,至少不用去下载和安装什么第三方的破包。