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

C 語言字串替換與子字串擷取函數實作(支援長度增減)

     編輯:關於C語言

字串替換 str_rep

功能:將 str 中所有 strSearch 替換為 strReplace,支援替換後長度增減,呼叫端需確保緩衝區足夠大。

char *str_rep(char *str, const char *strSearch, const char *strReplace) {
    if (!str || !strSearch || !strReplace) return NULL;
    size_t lenSearch = strlen(strSearch), lenReplace = strlen(strReplace);
    if (lenSearch == 0) return str; // 避免無限迴圈

    char *p = str;
    while ((p = strstr(p, strSearch))) {
        ptrdiff_t diff = lenReplace - lenSearch;
        if (diff > 0) { // 變長:尾部向後搬移
            size_t tailLen = strlen(p + lenSearch);
            memmove(p + lenReplace, p + lenSearch, tailLen + 1); // 含結束符
        } else if (diff < 0) { // 變短:尾部向前搬移
            memmove(p + lenReplace, p + lenSearch, strlen(p + lenSearch) + 1);
        }
        memcpy(p, strReplace, lenReplace);
        p += lenReplace; // 繼續搜尋下一處
    }
    return str;
}

子字串擷取 str_sub

簡單封裝 strncpy,確保以 \0 結尾。

char *str_sub(char *dest, const char *src, size_t begin, size_t len) {
    strncpy(dest, src + begin, len);
    dest[len] = '\0';
    return dest;
}

測試範例

char s1[100] = "123456789";
char s2[100];
str_rep(s1, "12", "1212");  // s1 變為 "12123456789"
str_sub(s2, s1, 2, 3);      // s2 為 "123"

關鍵實作細節

  1. 使用 memmove 處理重疊記憶體搬移,安全可靠。
  2. 替換後立即將搜尋指標推進 lenReplace,避免重複匹配新產生的子字串(如 str_rep("aaa", "a", "aa"))。
  3. lenSearch == 0 直接返回,防止死迴圈。
  4. 呼叫端責任:提供足夠大的緩衝區(建議預留 原長度 * (替換長/搜尋長) + 1)。

改進方向

  • 新增 maxLen 參數,防止緩衝區溢位。
  • 回傳替換次數或新字串長度。
  • 支援正則表達式搜尋(需引入 regex.h)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved