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

C 語言字符串替換函數實現:str 中 substr1 替換為 substr2 並返回新長度

     編輯:程式設計綜合問答

題目要求

實現 void fun(char *str, char *substr1, char *substr2, ...),將 str 中所有 substr1 替換為 substr2,統計替換後長度。接口允許在 ... 添加參數(如返回長度指針)。

完整實現 (動態內存、支持長度變化)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 返回替換後長度,str 需指向足夠大的緩衝區或由調用者負責重新分配
// 這裡採用「原地替換,假設緩衝區足夠大」的簡化版本
void fun(char *str, char *substr1, char *substr2, int *newLen) {
    if (!str || !substr1 || !substr2 || strlen(substr1) == 0) {
        if (newLen) *newLen = strlen(str);
        return;
    }
    size_t len1 = strlen(substr1), len2 = strlen(substr2);
    char *p = str, *q;
    int count = 0;
    // 第一遍:計算替換次數
    while ((q = strstr(p, substr1))) {
        count++;
        p = q + len1;
    }
    if (count == 0) {
        if (newLen) *newLen = strlen(str);
        return;
    }
    // 計算新長度,檢查緩衝區 (此處假設足夠)
    size_t oldLen = strlen(str);
    size_t newLength = oldLen + count * (len2 - len1);
    // 從後向前移動,避免覆蓋未處理數據
    char *src = str + oldLen;
    char *dst = str + newLength;
    *dst-- = '\0';
    while (src >= str) {
        // 檢查當前位置是否匹配 substr1 結尾
        if (src - str >= (long)len1 && memcmp(src - len1 + 1, substr1, len1) == 0) {
            // 複製 substr2
            for (size_t k = len2; k > 0; --k) *dst-- = substr2[k-1];
            src -= len1;
        } else {
            *dst-- = *src--;
        }
    }
    if (newLen) *newLen = newLength;
}

int main() {
    char str1[100] = "abcedfrbcxybc";
    char str2[100] = "abcedfrbceybce";
    int len;
    fun(str1, "bc", "ghi", &len);
    printf("結果: %s, 長度: %d\n", str1, len); // aghiedfrghixyghi, 16
    fun(str2, "bce", "gh", &len);
    printf("結果: %s, 長度: %d\n", str2, len); // aghdfrghygh, 11
    return 0;
}

關鍵技巧

  • 從後向前掃描移動:避免替換長度增大時覆蓋未處理數據(類似標準庫 memmove 思路)。
  • 兩遍掃描:先統計替換次數計算新長度,再實際替換。
  • 緩衝區假設:題目未要求動態分配,實際工程中應傳入緩衝區大小或返回新分配的指針(需在 ... 添加 char **outStr)。

參考代碼風格

原帖「半成品」採用前向掃描 + 臨時緩衝區,邏輯正確但效率較低。上述從後向前原地替換為經典高效寫法。

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