这些字符代码是以前写的,源于很久很久以前的一个VC++项目,在当时的部门编程比赛里因为用了项目代码的xsplit函数,万万没想到,那个做了几年的项目里面居然有坑。。xsplit函数居然不能split连续2个空格,囧,领导说,你要是用ruby你就满分了,让我与满分失之交臂,当时没有人得满分,因此记忆深刻;
后来又是boost C++库流行,这个我就不说了,用过的都说好,但是也有些小麻烦,就是用的多了,编译就特别慢,那个时候还不知道用incredbuild,于是乎就在代码上下功夫了。
做了一些常用的字符操作,基本上python string的函数基本实现了,放在博客里,也可以温故知新。
xstring.h
1 #ifndef XSTRING 2 #define XSTRING 3 4 typedef struct xstring { 5 char *str; 6 struct xstring *next; 7 } xstring; 8 9 10 ////////////////////////////////////////////////////////////////////////// 11 void* allocate(size_t size); 12 13 #ifdef USE_STD_MALLOC 14 #define dellocate(ptr) free(ptr); 15 #else 16 #define dellocate(ptr) mem_ret(ptr); 17 #endif 18 19 ////////////////////////////////////////////////////////////////////////// 20 xstring* xstring_new(size_t size); 21 void xstring_delete(xstring **head); 22 int xstring_size(xstring *head); 23 24 ////////////////////////////////////////////////////////////////////////// 25 size_t count(char* src, char* dst); 26 char* replace(char *src, char *old_val, char *new_val); 27 xstring* split(char *str, char *delimter); 28 char* strip(char *str); 29 char* lstrip(char *str); 30 char* rstrip(char *str); 31 int start_with(char *str, char *sym); 32 int end_with(char *str, char *sym); 33 char* uniq_seq_repeat_chars(char *str); 34 35 #endif
xstring.c
1 #include <stdlib.h> 2 #include <string.h> 3 #include <ctype.h> 4 #include <assert.h> 5 #include "xstring.h" 6 #include "mem_pool.h" 7 8 void* allocate(size_t size) { 9 #ifdef USE_STD_MALLOC 10 return malloc(size); 11 #else 12 return mem_get(size); 13 #endif 14 } 15 16 xstring* xstring_new(size_t size) { 17 xstring *s = (xstring *)allocate(sizeof(xstring)); 18 if (!s) return NULL; 19 20 s->str = (char *)allocate(size+1); 21 if (!s->str) { 22 dellocate(s); 23 return NULL; 24 } 25 26 s->next = NULL; 27 return s; 28 } 29 30 void xstring_delete(xstring** head) { 31 xstring *curr = *head; 32 xstring *next; 33 34 while(curr) { 35 next = curr->next; 36 if (curr->str) dellocate(curr->str); 37 dellocate(curr); 38 curr = next; 39 } 40 *head = NULL; 41 return; 42 } 43 44 int xstring_size(xstring* head) { 45 int size = 0; 46 while (head) { 47 size++; 48 head = head->next; 49 } 50 return size; 51 } 52 53 static void string_copy(char *dst, char *src, int len) { 54 if (!dst || !src) return; 55 strncpy(dst, src, len); 56 dst[len] = '