采用面向對象的程式設計範式
廢話不多說,直接上代碼
#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;
}