C 標準庫字串操作函數(strcat、strcpy 等)缺乏邊界檢查,易導致緩衝區溢位。本工具類 CString 封裝動態記憶體管理,提供安全、自動擴容的字串操作介面,適合嵌入式或無 C++ STL 環境的專案。
typedef struct {
char *p; // 字串資料指標
int reallength; // 目前配置的總容量(含結尾 \0)
} CString;
typedef CString MyString; // 簡短別名
| 函數 | 功能 |
|---|---|
init(s) | 初始化為空字串 |
initWithLength(s, len) | 預分配指定容量並清零 |
initWithString(s, src) | 複製現有字串初始化 |
backAddChar(s, ch) | 尾部追加單一字元 |
backAddString(s, str) | 尾部追加字串 |
addChar(s, ch, pos) | 在指定位置插入字元 |
addString(s, str, pos) | 在指定位置插入字串 |
findFirstChar(s, ch) | 尋找首個字元位址 |
findFirstString(s, str) | 尋找首個子字串位址 |
deleteFirstChar(s, ch) | 刪除首個匹配字元 |
deleteFirstString(s, str) | 刪除首個匹配子字串 |
changeFirstChar(s, old, new) | 替換首個匹配字元 |
changeFirstString(s, old, new) | 替換首個匹配子字串 |
printfString(s) | 列印字串內容 |
run(s) | 將字串視為系統指令執行 |
void backAddString(MyString *s, char *str) {
int curLen = myStrlen(s->p);
int addLen = myStrlen(str);
if (curLen + addLen + 1 > s->reallength) {
int need = curLen + addLen + 1 - s->reallength;
s->p = (char *)realloc(s->p, s->reallength + need);
s->reallength += need;
}
myStrcat(s->p, str); // 安全拼接
}
同樣邏輯應用於 addString、addChar,確保永不越界。
// 插入字串:從尾部向前搬移騰出空間
for (int i = curLen; i >= curLen - moveLen; --i)
s->p[i + insLen] = s->p[i];
for (int j = 0; j < insLen; ++j)
s->p[curLen - moveLen + j] = str[j];
// 刪除字串:從刪除點向前覆蓋
char *p = findPos, *q = p + delLen;
while (*q) *p++ = *q++;
*p = '\0';
int myStrlen(char *p) { int len=0; while(*p++) len++; return len; }
char *myStrcpy(char *dst, const char *src) { char *ret=dst; while(*src) *dst++=*src++; *dst='\0'; return ret; }
char *myStrcat(char *dst, const char *src) { char *ret=dst; while(*dst) dst++; while(*src) *dst++=*src++; *dst='\0'; return ret; }
char *myStrchr(const char *s, char c) { while(*s) if(*s==c) return (char*)s; else s++; return NULL; }
char *myStrstr(const char *hay, const char *needle) { /* 雙重迴圈暴力比對 */ }
※ 實際專案建議直接使用標準庫 string.h,此處僅供演示原理。
int main() {
MyString s;
initWithString(&s, "note");
backAddString(&s, "padnotepadnotepad"); // 自動擴容
while (findFirstString(&s, "notepad")) {
changeFirstString(&s, "notepad", "123456789"); // 替換所有
}
printfString(&s); // 輸出: 123456789pad123456789pad123456789
free(s.p); // 記得釋放
return 0;
}
| 優點 | 缺點 / 待改進 |
|---|---|
| 介面直觀,涵蓋常見操作 | 非執行緒安全 |
| 自動擴容,杜絕緩衝區溢位 | 頻繁 realloc 可能造成記憶體碎片 |
| 純 C 實作,零依賴 | 未支援 UTF-8 多位元組字元語意操作 |
| 程式碼清晰,適合教學 | 缺少迭代器、比較、分割等高階功能 |
capacity 成長策略(如 ×2 指數增長)減少 realloc 次數。trim、split、toUpper/Lower、format (vsnprintf) 等常用功能。const 正確性:查詢類函數參數加 const。std::string 或 QString 等成熟庫。這個 CString 工具類雖簡單,卻展示了 C 語言手動記憶體管理的核心模式:**擁有權清晰、邊界檢查完備、擴容策略合理**。在無法使用 C++ 的環境中,它是處理可變長字串的可靠基石。