首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言字串工具類完整實作:動態擴容、增刪改查一站式

     編輯:關於C

設計目標

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)將字串視為系統指令執行

關鍵實作細節

1. 自動擴容機制

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,確保永不越界。

2. 記憶體搬移實現插入/刪除

// 插入字串:從尾部向前搬移騰出空間
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';

3. 手工實現標準庫函數(教學用)

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 多位元組字元語意操作
程式碼清晰,適合教學缺少迭代器、比較、分割等高階功能

建議擴充

  1. 引入 capacity 成長策略(如 ×2 指數增長)減少 realloc 次數。
  2. 增加 trim、split、toUpper/Lower、format (vsnprintf) 等常用功能。
  3. 提供 const 正確性:查詢類函數參數加 const。
  4. 若專案允許 C++,直接改用 std::string 或 QString 等成熟庫。

結語

這個 CString 工具類雖簡單,卻展示了 C 語言手動記憶體管理的核心模式:**擁有權清晰、邊界檢查完備、擴容策略合理**。在無法使用 C++ 的環境中,它是處理可變長字串的可靠基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved