C的字符串操作接口實現
阿新 • • 發佈:2017-05-08
efi 我想 troy nginx con pty 指針 .com 緩沖區
當中cstring是一個字符串句柄,指向詳細的字符串內容。cstring的前面還有8個字節。前面4個字節表示字符串的長度。後面4個字節表示緩沖區還剩余的長度。 函數cstr_init()會為string_t開辟一個大於其sizeof大小的內存塊。前面8字節用於struct結構信息的存儲,後面用於字符串內容存儲。
近期在寫一個關於用HTTP控制storm的的UI功能。已經實現完畢,採用在nginx裏面增加相應的模塊調用來實現,模塊中調用一個動態載入的SO。這個SO用THRIFT和zookeeper client實現對storm的控制和信息的存儲固化。開始我使用了std::string來做字符串處理。後來發現string實在太多未知的對象構建和內存分配,加上我想把so改用純C的實現。
std::string自然就須要被替換。在網絡上找了非常久相關C語言的string 實現。沒有。於是參照《C語言接口與實現》裏字符串操作的實現接口,是實現了一個便捷的C字符串處理的接口。接口例如以下:
typedef char* cstring; /*init and destory*/ cstring cstr_init(); cstring cstr_initchar(const char* v, size_t v_size); void cstr_destroy(cstring s); /*get string context*/ char* cstr_value(cstring s); /*cstring size*/ size_t cstr_size(cstring s); uint8_t cstr_empty(cstring s); /*update size by ‘\0‘*/ void cstr_update(cstring s); /*cstring cat*/ cstring cstr_cat(cstring dst, cstring src); cstring cstr_catchar(cstring dst, const char* v, size_t v_size); /*cstring copy*/ cstring cstr_cpy(cstring dst, cstring src); cstring cstr_cpychar(cstring dst, const char* v, size_t v_size); /*cstring cmp*/ int32_t cstr_cmp(cstring s1, cstring s2); int32_t cstr_cmpchar(cstring s, const char* v, size_t v_size); /*cstring lower upper*/ void cstr_tolower(cstring s); void cstr_toupper(cstring s); /*del cset from cstring*/ cstring cstr_trim(cstring s, const char* cset); void cstr_clear(cstring s); /*sprintf format*/ cstring str_printf(cstring s, const char* fmt, ...); /*number to cstring*/ cstring itocstr(cstring s, int64_t v); /*cstring to number*/ int64_t cstrtoi(cstring s); /*cstring dump*/ void cstr_dump(cstring s); #endif
當中cstring是一個字符串句柄,指向詳細的字符串內容。cstring的前面還有8個字節。前面4個字節表示字符串的長度。後面4個字節表示緩沖區還剩余的長度。
其結構例如以下:
/*define string struct*/ typedef struct string_s{ int32_t len;<span style="white-space:pre"> </span>/*字符串的長度*/ int32_t free;<span style="white-space:pre"> </span>/*緩沖區還剩余的長度*/ char buf[];<span style="white-space:pre"> </span>/*cstring的指針地址*/ }string_t;
在調用類似cstr_cat函數假設free的內存不夠時。接口會自己主動分配一個更大的內存塊來取代。這樣做的目的是為了調用者不用關心內存溢出的問題。
關於這個接口的所有代碼實現。已經放到gti hub上,能夠做為C的字符串操作的參考。
git地址https://github.com/yuanrongxi/c_string
C的字符串操作接口實現