CuTest源码分析(1)——CuString
CuString结构体类型定义
位置:CuTest.h
源码:
typedef struct { int length;//长度 int size;//大小 char* buffer;//缓冲区 } CuString;
宏定义:
#define HUGE_STRING_LEN 8192//巨长字符串长度 #define STRING_MAX 256//字符串最大长度 #define STRING_INC 256//字符串增加长度
操作函数包含:
char* CuStrAlloc(int size); char* CuStrCopy(const char* old); void CuStringInit(CuString* str); CuString* CuStringNew(void); void CuStringRead(CuString* str, const char* path); void CuStringAppend(CuString* str, const char* text); void CuStringAppendChar(CuString* str, char ch); void CuStringAppendFormat(CuString* str, const char* format, ...); void CuStringInsert(CuString* str, const char* text, int pos); void CuStringResize(CuString* str, int newSize); void CuStringDelete(CuString* str);
操作函数定义位置:CuTest.c
源码分析:
//申请一段内存,大小为size字节 //返回该内存的首地址 char* CuStrAlloc(int size) { char* newStr = (char*) malloc( sizeof(char) * (size) ); return newStr; }
//复制字符串 //返回新字符串首地址 char* CuStrCopy(const char* old) { int len = strlen(old); char* newStr = CuStrAlloc(len + 1); strcpy(newStr, old); return newStr; }
//初始化一个CuString结构体 void CuStringInit(CuString* str) { str->length = 0; str->size = STRING_MAX; str->buffer = (char*) malloc(sizeof(char) * str->size);//申请空间 str->buffer[0] = '\0';//字符串为空 }
//生成一个新的CuString结构体 //返回该结构体指针 CuString* CuStringNew(void) { CuString* str = (CuString*) malloc(sizeof(CuString)); str->length = 0; str->size = STRING_MAX; str->buffer = (char*) malloc(sizeof(char) * str->size); str->buffer[0] = '\0'; return str; }
//删除一个CuString结构体 //释放buf和结构体内存空间 void CuStringDelete(CuString *str) { if (!str) return; free(str->buffer); free(str); }
//改变CuString中buffer大小 //realloc原型:void *realloc(void *mem_address, unsigned int newsize) //先判断当前的指针是否有足够的连续空间 //如果有,扩大mem_address指向的地址,并且将mem_address返回 //如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域, //而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free), //同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。 void CuStringResize(CuString* str, int newSize) { str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize); str->size = newSize; }
//向CuString的buffer中追加字符串 //将text指向的字符串追加到buffer后面 void CuStringAppend(CuString* str, const char* text) { int length; if (text == NULL) { text = "NULL"; } length = strlen(text); if (str->length + length + 1 >= str->size) CuStringResize(str, str->length + length + 1 + STRING_INC); str->length += length; strcat(str->buffer, text);//text字符串追加到buffer后面 }
//向CuString的buffer中追加字符 //将ch字符追加到buffer后面 void CuStringAppendChar(CuString* str, char ch) { char text[2]; text[0] = ch; text[1] = '\0'; CuStringAppend(str, text); }
//向CuString的buffer中追加格式字符串 //将格式字符串追加到buffer后面 void CuStringAppendFormat(CuString* str, const char* format, ...) { va_list argp; char buf[HUGE_STRING_LEN]; va_start(argp, format); vsprintf(buf, format, argp); va_end(argp); CuStringAppend(str, buf); }
//向CuString的buffer中插入字符串 //pos表示插入的位置 //如果pos比str->length大,则插在buffer末尾 //将buffer[pos]及后面数据,向后挪动text字符串长度个位置 //将text字符串插到pos位置处 void CuStringInsert(CuString* str, const char* text, int pos) { int length = strlen(text); if (pos > str->length) pos = str->length; if (str->length + length + 1 >= str->size) CuStringResize(str, str->length + length + 1 + STRING_INC); memmove(str->buffer + pos + length, str->buffer + pos, (str->length - pos) + 1); str->length += length; memcpy(str->buffer + pos, text, length); }

浙公网安备 33010602011771号