众所周知,C++ 中的string使用比较方便。关于C++ 中的string源码实现
最近工作中使用C语言,但又苦于没有高效的字符串实现,字符串的拼接和裁剪都比较麻烦,而且每个字符串都需要申请内存,内存的申请和释放也很容易出bug,怎么高效的实现一个不需要处理内存问题并且可以动态扩容进行拼接和裁剪的string呢?
一个好的string应该有以下功能?
- 创建字符串
- 删除字符串
- 尾部追加字符串
- 头部插入字符串
- 从尾部删除N个字符
- 从头部删除N个字符
- 裁剪字符串
- 获取字符串长度
- 获取完整字符串
下面,我们来看看各个功能的实现。
首先定义一个string的句柄,相当于C++中的实例。
- struct c_string;
- typedef struct c_string c_string_t;
在内部string的实现如下:
- // string的初始内存大小
- static const size_t c_string_min_size = 32;
-
- struct c_string {
- char *str; // 字符串指针
- size_t alloced; // 已分配的内存大小
- size_t len; // 字符串的实际长度
- };
创建字符串:
- c_string_t *c_string_create(void) {
- c_string_t *cs;
-
- cs = calloc(1, sizeof(*cs));
- cs->str = malloc(c_string_min_size);
- *cs->str = '