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

C++ 字符串處理實戰:提取數字、合併、統計、刪除與替換子串

     編輯:關於C語言

前言

字符串操作是 C/C++ 程式設計的基礎功夫,也是面試高頻考點。本文匯總五大實用場景:從字符串提取整數、用指針合併兩字符串、統計字母出現次數、刪除指定子串、替換子串。所有函數均採用指針操作,註釋詳盡,可直接用於項目或面試準備。

1. 字符串提取數字

需求

掃描字符串,將連續的數字字符轉為整數存入陣列,返回提取出的整數個數。例如 "af52d78d56dd89d" → [52, 78, 56, 89]。

核心邏輯

  • 外層遍歷字符串,遇到數字字符進入內層循環;
  • 內層累積 tmp = tmp * 10 + (*src - '0') 直到非數字;
  • 存入輸出陣列,計數器遞增。

實作

int take_num(const char* src, int outArr[]) {
    assert(src != NULL);
    int count = 0, tmp = 0;
    while (*src != '\0') {
        tmp = 0;
        if (*src >= '0' && *src <= '9') {
            while (*src >= '0' && *src <= '9') {
                tmp = tmp * 10 + *src - '0';
                src++;
            }
            outArr[count++] = tmp;
        } else {
            src++;
        }
    }
    return count;
}

2. 合併兩字符串(指針實現)

需求

將 str1 與 str2 拼接為新字符串並返回,必須動態分配內存,調用者負責釋放。

關鍵點

  • 分配 strlen(str1) + strlen(str2) + 1 字節;
  • 用 address 保存起始地址以便返回;
  • 拷貝結束後手動加 '\0'。

實作

const char* mergeString(const char* str1, const char* str2) {
    if (str1 == NULL) return str2;
    if (str2 == NULL) return str1;
    char* result = new char[strlen(str1) + strlen(str2) + 1];
    char* address = result;
    while (*str1 != '\0') *result++ = *str1++;
    while (*str2 != '\0') *result++ = *str2++;
    *result = '\0';
    return address;
}

3. 連續字符串字母統計

需求

統計字符串中每個大寫字母(A-Z)出現的次數並打印。假設輸入僅含大寫字母。

實作

void countString(const char* str) {
    assert(str != NULL);
    int a[52] = {0}; // 擴展至 52 兼容大小寫
    while (*str != '\0') {
        if (*str >= 'A' && *str <= 'Z') a[*str - 'A']++;
        str++;
    }
    for (int i = 0; i < 26; i++) {
        if (a[i] != 0) cout << char(i + 'A') << a[i];
    }
}

4. 刪除包含的子串

需求

從 src 中刪除所有 substring,結果存入 result,返回刪除次數。

核心邏輯

  • 用臨時緩衝區 tmp 截取當前位置長度為 strlen(substring) 的片段;
  • strcmp 比對,匹配則跳過該長度,計數器遞增;
  • 否則逐字符拷貝到 result。

實作

int delete_substring(const char* src, const char* substring, char* result) {
    assert(src != NULL && substring != NULL);
    int count = 0, subLen = strlen(substring);
    char* tmp = new char[subLen + 1];
    char* pCpy = result;
    while (*src != '\0') {
        if (*src == *substring) {
            strncpy(tmp, src, subLen);
            tmp[subLen] = '\0';
            if (strcmp(substring, tmp) == 0) {
                count++;
                src += subLen;
            } else {
                *pCpy++ = *src++;
            }
        } else {
            *pCpy++ = *src++;
        }
    }
    *pCpy = '\0';
    delete[] tmp;
    return count;
}

5. 替換子串

需求

將 src 中所有 oldstr 替換為 newstr,返回新字符串(動態分配)。

難點與解法

  • 新串可能比舊串長,需預分配足夠空間:len_src/len_old * len_new + 1;
  • 同樣用 tmp 做匹配,匹配成功則拷貝 newstr 並跳過 oldstr 長度;
  • 維護返回地址 fanhui。

實作

char* replaceString(char* src, const char* oldstr, const char* newstr) {
    assert(src && oldstr && newstr);
    int len_src = strlen(src), len_old = strlen(oldstr), len_new = strlen(newstr);
    char* result = new char[len_new > len_old ? len_src / len_old * len_new + 1 : len_src];
    char* fanhui = result;
    char* tmp = new char[len_old + 1];
    char* markNew;
    while (*src != '\0') {
        if (*src == *oldstr) {
            strncpy(tmp, src, len_old);
            tmp[len_old] = '\0';
            if (strcmp(tmp, oldstr) == 0) {
                markNew = (char*)newstr;
                while (*markNew != '\0') *result++ = *markNew++;
                src += len_old;
            } else {
                *result++ = *src++;
            }
        } else {
            *result++ = *src++;
        }
    }
    *result = '\0';
    delete[] tmp;
    return fanhui;
}

測試主程式

int main() {
    // 測試刪除子串
    char* str1 = "abcdabac";
    char* str2 = "ab";
    char* result = new char[strlen(str1) + 1];
    delete_substring(str1, str2, result);
    cout << "刪除後: " << result << endl;
    delete[] result;

    // 測試提取數字
    char* strin = "af52d78d56dd89d";
    int* outArray = new int[strlen(strin)];
    take_num(strin, outArray);

    // 測試替換子串
    char* srcstr = "22abcdabokabhaha";
    char* newstr = "xyz";
    char* oldstr = "ab";
    char* replaced = replaceString(srcstr, oldstr, newstr);
    cout << "替換後: " << replaced << endl;
    delete[] replaced;

    // 測試合併字符串
    // char* s1 = "nihao";
    // char* s2 = "xyz";
    // char* merged = mergeString(s1, s2);
    // cout << merged << endl;
    // delete[] merged;

    // 測試字母統計
    char* str = "aaabbbbDDdjingianigndai";
    countString(str);

    return 0;
}

總結

本文五個函數展示了 C 風格字符串的指針操作精髓:動態內存管理、雙指針遍歷、臨時緩衝區匹配、返回地址保存。實戰中注意:

  1. 所有 new 必須配對 delete[];
  2. 輸入指針合法性斷言;
  3. 字符串結束符 '\0' 正確處理。

掌握這些模式,字符串處理不再是痛點。

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