这里开始第二篇博客,正式的开始分析函数。
doit(char *text)
先分析main()函数里面出现的第一个函数吧,doit()这个函数前面有英文的简单介绍此函数是干什么的,大概意思就是将文本解析为JSON格式,然后在转化为文本格式,最后进行打印。我把一些代码自己的注释在了代码后边,如下图:
我先把text给贴出来方面大家对着代码观看:
我觉得这位作者代码功底很扎实(皮一下很开心,嘻嘻!),这代码就给人很清爽嘛,区区十来行,给人很容易理解。如果你只是需要大概的理解下该函数的作用的话,我想大概也就不需要再深究。不过因为我是来学习的,所以我得细究其具体的实现,那么我们就从第一个cJSON_Parse(text)开始跳转吧,进去看看卖的什么药。
嗯,不知道你们有没有哭,反正我是哭了,这跳转的有完没完的啊,我都不知道看到哪了。。。好吧,我们拿出小本本开始做笔记,把每一个函数的跳转记录下来。再一个一个的回去,这样就简单很多了。鉴于本人手写稿子实在是难看,我用visio画下来和大家比对比对(如果有看错的,欢迎大家留言讨论)。
如上图所示,当跳到parse_string()函数时就是最后一个函数了,还好只有五个函数,可是刚开始看得时候还是把我看晕了。嗯好了今天我们就解决parse_string()函数。
parse_string()
我先讲讲这个函数时干什么的,这给代码就是把双引号之前的字符串截取出来,保存在item->valuestring中(后续会保存在item->string,而item->valuestring保存的是冒号之后的字符串)。如下图框出来的字符串:
其中第一个while()是为了获取字符串长度,需要把该字符串保存在out里面。
后续代码比较好理解我们主要来 分析下下个while语句中的switch语句。
要比较容易的看懂话, 我们对着前面的text1一起看,很明显在我全出来的第二个框里面,出现了‘ \\ ’,那就可以从这里开始一行一行代码的理解。
因为所举的例子也比较简单,直接就跳到default了。而里面比较复杂的是case ‘u’; 所以我们还是主要来分析下这个case。我把test里面的text 都看了下,发现没有没出这种case的情况,所以如果想的话可以自己加个text,然后加个断点,进行调试一行一行进行分析,当然这有点耍小聪明了,哈哈。我就直接分析吧,后面可以在自己测试看分析的对不对。
这段代码的作用后面有写,就是将utf16的代码转化成utf8的代码。嗯。。。其实我对这些不太熟悉。我先去百度看看。
utf 是Unicode TransferFormat的缩写,即把Unicode转做为某种格式的意思。后面的数字表明至少使用多少个比特位来存储字符。我就不在这里仔细解释了,实在是费时间,我们还是搞快点比较好,如果想了解的话,这里贴一个大神讲的,讲的是真不错:cJSON详细剖析(二)——doit(char *text)函数框架及parse_string()函数分析
感到十分抱歉,我大概花了2小时来了解Unicode 、UTF8和UTF16, 内容实在是太多,这里就不在详细赘述了,如果真的想要详细了解的话,这里推荐大家看看有位大神写的博客,也就是我刚刚在看的博客,只是内容有点多。大家有兴趣的可以去看看,如果后续自己看完之后再来写一篇心得。传送门:https://www.cnblogs.com/benbenalin/p/7152570.html
就这样吧,我就不再仔细解释了,看了越多越觉得自己有太多不懂,还有太多的需要自己去掌握。希望自己好好的学习,望大家共勉。
今天的文章function string_函数substr(“DATASTRUCTURE”,5,9)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65156.html