龙空技术网

数据结构之动态字符串上篇

cpp攻城狮 146

前言:

而今你们对“c语言字符串长度函数包含结束符”大体比较关切,大家都需要分析一些“c语言字符串长度函数包含结束符”的相关内容。那么小编也在网上收集了一些关于“c语言字符串长度函数包含结束符””的相关知识,希望我们能喜欢,同学们快快来了解一下吧!

在学习动态字符串之前我们先思考一个问题,如何实现一个扩容方便且二进制安全的字符串呢,我们都知道在C语言中字符串以"\0"结束,这就引入了一个问题如果字符串本身就包含"\0"且在字符串中是有效的数据,那么此时读取数据"\0"以后的部分就会被截断,这并非我们想要的,那是否有解决的办法呢,答案是肯定有的,废话不多说直接上图

我们来分析一下这个结构:

1、len 代表着buf中已占用的字节。

2、free 代表着buf中剩余的字节。

3、使用的是柔性数组代表着数据空间,必须放在结构体的尾部。

在64位的操作系统下len和free各自占用了4个字节紧接着存放字符串,这个结构有什么优点呢?

1、有单独的统计变量len和free(称为头部)。可以很方便地得到字符串长度。

2、内容存放在柔性数组buf中,DynamicStr对上层暴露的指针不是指向结构体DynamicStr的指针,而是直接指向柔性数组buf的指针。上层可像读取C字符串一样读取DynamicStr的内容,兼容C语言处理字符串的各种函数。

3、由于有长度统计变量len的存在,读写字符串时不依赖“\0”终止符,保证了二进制安全。

如何使用:

我们来分析一下这个初始化函数:

1、initLen 代表着要初始化字符串的长度。

2、malloc 分配空间为什么要加1? 这是因为结束符'\0'。

3、返回的是柔性数组的指针并不是DynamicStr结构体指针。

4、外部可以通过指针的偏移得到 DynamicStr首部。

总结:

这就是动态分配字符串的基本数据结构,希望对你们有所帮助,有了这个结构后续对buf的扩容缩容以及读取删除可以利用指针的偏移来进行操作我就不再赘述。当然啦这个结构也暴露了一个问题:不同长度的字符串是否有必要占用相同大小的头部?这里先买个关子,后续会对这个结构进行优化。

标签: #c语言字符串长度函数包含结束符