首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言字串替換:查找並替換所有出現的子串完整實作

     編輯:程式設計疑難解答

問題需求

給定三字串 src、oldSub、newSub,將 src 中所有 oldSub 替換為 newSub。例:"abcabcdefghij" 替換 "fgh" 為 "sk" → "abcabcdeskij"。

演算法步驟

  1. 計算 oldSub 在 src 中出現次數 cnt。
  2. 分配新緩衝區:newLen = strlen(src) + cnt * (strlen(newSub) - strlen(oldSub)) + 1。
  3. 雙指針掃描 src:
    • 匹配 oldSub → 複製 newSub 到目標,源指針跳過 oldSub 長度。
    • 不匹配 → 複製單字元,源指針 +1。
  4. 返回新字串(呼叫者負責 free)。

完整代碼實作

char* str_replace(const char* src, const char* oldSub, const char* newSub) {
    if (!src || !oldSub || !newSub || !*oldSub) return strdup(src);
    
    size_t oldLen = strlen(oldSub), newLen = strlen(newSub);
    size_t srcLen = strlen(src);
    
    // 統計出現次數
    size_t cnt = 0;
    for (const char* p = src; (p = strstr(p, oldSub)); p += oldLen) cnt++;
    
    // 分配結果緩衝區
    size_t resLen = srcLen + cnt * (newLen >= oldLen ? newLen - oldLen : 0) + 1;
    char* res = malloc(resLen);
    if (!res) return NULL;
    
    // 執行替換
    char* dst = res;
    const char* p = src;
    while (*p) {
        if (strncmp(p, oldSub, oldLen) == 0) {
            memcpy(dst, newSub, newLen);
            dst += newLen;
            p += oldLen;
        } else {
            *dst++ = *p++;
        }
    }
    *dst = '\0';
    return res;
}

邊界情況處理

  • oldSub 為空串 → 直接返回原串副本,避免無限迴圈。
  • 記憶體不足 → 返回 NULL,呼叫者檢查。
  • 重疊匹配:strstr 找到最左匹配,替換後繼續掃描,符合標準替換語義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved