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);
}

 

  

 

posted @ 2020-05-03 15:49  hifish  阅读(10)  评论(0)    收藏  举报