天天看點

用純C語言打造字元串處理庫

作者:喝咖啡的陶叔

采用面向對象的程式設計範式

廢話不多說,直接上代碼

#include <string.h>

#include <malloc.h>

typedef struct _charing charing;

//聲明charing類

struct _charing {

char *chaddr;

unsigned int length;

void (*init)(charing *self, char *str);

char* (*dynm_copy)(charing *self);

char* (*dynm_cut)(charing *self, int index);

char* (*dynm_reserve)(charing *self, int index);

char* (*dynm_add)(charing *self, char *str);

char* (*dynm_hard_replace)(charing *self, char *find_str, char *replace_str);

char* (*dynm_soft_replace)(charing *self, char *find_str, char *replace_str);

};

//聲明charing_attr類,charing類的無方法版本

//用于某些情況下減少記憶體而使用

typedef struct _charing_attr

{

char *chaddr;

unsigned int length;

} charing_attr;

void _init(charing *self, char *str) {

//靜态初始化方法

self->chaddr = str;

self->length = strlen(str);

}

char* _dynm_copy(charing *self) {

//深複制方法

char *tmpstr = (char*)malloc(self->length + 1);

strcpy(tmpstr, self->chaddr);

return tmpstr;

}

char* _dynm_cut(charing *self, int index) {

//從左邊開始裁剪字元串

if (0 < index && index < self->length) {

char *tmpstr = (char*)malloc(self->length + 1 - index);

strcpy(tmpstr, self->chaddr + index);

return tmpstr;

} else {

return NULL;

}

}

char* _dynm_reserve(charing *self, int index) {

//從右邊開始裁剪字元串

if (0 < index && index < self->length) {

char *tmpstr = (char*)malloc(index + 1);

strncpy(tmpstr, self->chaddr, index);

tmpstr[index] = '\0';

return tmpstr;

} else {

return NULL;

}

}

char* _dynm_add(charing *self, char *str) {

//字元串拼接

char *tmpstr = (char*)malloc(self->length + strlen(str) + 1);

strcpy(tmpstr, self->chaddr);

return strcat(tmpstr, str);

}

char* _dynm_hard_replace(charing *self, char *find_str, char *replace_str) {

//字元串硬替換,替換字元串比目标字元串長會直接覆寫目标字元串後面的字元

//比目标字元串短剩餘的字元保持不變

char *found = strstr(self->chaddr, find_str);

if (found) {

unsigned int poiter_offset = found - self->chaddr;

unsigned int replace_length = strlen(replace_str);

if (strlen(found) >= replace_length) {

unsigned int replace_endchar_index = (found + replace_length) - self->chaddr;

char *tmpstr = (char*)malloc(self->length + 1);

strcpy(tmpstr, self->chaddr);

strcpy(tmpstr + poiter_offset, replace_str);

tmpstr[replace_endchar_index] = self->chaddr[replace_endchar_index];

return tmpstr;

} else {

unsigned int new_str_size = found - self->chaddr + replace_length + 1;

char *tmpstr = (char*)malloc(new_str_size);

strcpy(tmpstr, self->chaddr);

strcpy(tmpstr + poiter_offset, replace_str);

return tmpstr;

}

} else {

return NULL;

}

}

char* _dynm_soft_replace(charing *self, char *find_str, char *replace_str) {

//字元串彈性替換

char *found = strstr(self->chaddr, find_str);

if (found) {

unsigned int poiter_offset = found - self->chaddr;

unsigned int find_length = strlen(find_str);

unsigned int replace_length = strlen(replace_str);

unsigned int new_str_size = self->length + replace_length - find_length + 1;

char *tmpstr = (char*)malloc(new_str_size);

strcpy(tmpstr, self->chaddr);

strcpy(tmpstr + poiter_offset, replace_str);

strcpy(tmpstr + poiter_offset + replace_length, self->chaddr + poiter_offset + find_length);

return tmpstr;

} else {

return NULL;

}

}

charing* create_charing(char *str) {

//構造函數

charing *self = (charing*)malloc(sizeof(charing));

self->init = _init;

self->dynm_copy = _dynm_copy;

self->dynm_cut = _dynm_cut;

self->dynm_reserve = _dynm_reserve;

self->dynm_add = _dynm_add;

self->dynm_hard_replace = _dynm_hard_replace;

self->dynm_soft_replace = _dynm_soft_replace;

self->init(self, str);

return self;

}

charing* dynm_create_charing(char *str) {

//動态構造函數

charing *self = create_charing(str);

self->chaddr = self->dynm_copy(self);

return self;

}