眾所周知,C++ 中的string使用比較方便,關(guān)于C++ 中的string源碼實(shí)現(xiàn)可以看我的這篇文章:源碼分析C++的string的實(shí)現(xiàn)
最近工作中使用C語言,但又苦于沒有高效的字符串實(shí)現(xiàn),字符串的拼接和裁剪都比較麻煩,而且每個(gè)字符串都需要申請(qǐng)內(nèi)存,內(nèi)存的申請(qǐng)和釋放也很容易出bug,怎么高效的實(shí)現(xiàn)一個(gè)不需要處理內(nèi)存問題并且可以動(dòng)態(tài)擴(kuò)容進(jìn)行拼接和裁剪的string呢?
一個(gè)好的string應(yīng)該有以下功能?
創(chuàng)建字符串
刪除字符串
尾部追加字符串
頭部插入字符串
從尾部刪除N個(gè)字符
從頭部刪除N個(gè)字符
裁剪字符串
獲取字符串長度
獲取完整字符串
下面來看看各個(gè)功能的實(shí)現(xiàn):
首先定義一個(gè)string的句柄,相當(dāng)于C++中的實(shí)例
struct c_string;typedef struct c_string c_string_t;
在內(nèi)部string的實(shí)現(xiàn)如下:
// string的初始內(nèi)存大小static const size_t c_string_min_size = 32;struct c_string { char *str; // 字符串指針 size_t alloced; // 已分配的內(nèi)存大小 size_t len; // 字符串的實(shí)際長度};
創(chuàng)建字符串:
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 = ‘