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

C/C++ 學習之路(第 09 課):字串操作核心函式手寫實作

     編輯:關於C語言

為什麼要手寫 strcpy、strcmp、strcat?

標準庫函式雖好用,但面試、考試、嵌入式環境常要求手寫實作。深入理解指標走訪、字串結束判斷 (\0)、記憶體邊界處理,是 C 語言功力的試金石。本課完整實作 6 大字串核心操作。

六大函式完整實作

1. 字串取代 strReplace

void strReplace(char *soucrStr, char *replaceStr, int pos) {
    while (pos > 0 && *soucrStr != '\0') { soucrStr++; pos--; } // 移至指定位置
    while (*soucrStr != '\0' && *replaceStr != '\0') {
        *soucrStr = *replaceStr; // 逐字元取代
        soucrStr++; replaceStr++;
    }
}

2. 字串複製 strCopy (對應 strcpy)

char *strCopy(char *distStr, const char *sourceStr) {
    char *address = distStr; // 保存起始位址供返回
    while ((*distStr++ = *sourceStr++) != '\0'); // 賦值、比較、遞增一次完成
    return address;
}

關鍵細節:*distStr++ = *sourceStr++ 利用後置遞增優先級,先取值賦值再移動指標。迴圈條件直接判斷賦值結果是否為 \0,極度精簡。

3. 字串比較 strCompare (對應 strcmp)

int strCompare(char *str1, char *str2) {
    while (*str1 && *str2 && (*str1 == *str2)) { str1++; str2++; }
    return *str1 - *str2; // 相同=0,str1大=正,str2大=負
}

4. 字串連接 strConcat (對應 strcat)

char *strConcat(char *distStr, char *sourceStr) {
    char *address = distStr;
    while (*distStr) distStr++; // 先找到目的字串尾端 (\0)
    while ((*distStr++ = *sourceStr++) != '\0'); // 接上來源字串
    return address;
}

易錯點:尋找尾端時不能用 while(*distStr++),否則指標會多移一格導致殘留 \0 被覆蓋錯位。

5. 字串反轉 strConvert

void strConvert(char *str) {
    int len = strLength(str), mid = len / 2;
    for (int i = 0; i < mid; i++) {
        char tmp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = tmp; // 首尾交換,僅需跑一半
    }
}

6. 字串長度 strLength (對應 strlen)

int strLength(char *str) {
    int len = 0;
    while (*str++) len++; // 指標走訪計數
    return len;
}

測試主程式與輸出

void strOperate() {
    char source[] = "China", rep[] = "ese";
    strReplace(source, rep, 4); puts(source); // Chinese

    char distStr[10]; strCopy(distStr, "abcdefg"); puts(distStr); // abcdefg

    printf("%d\n", strCompare("ABCD", "ABC")); // 1 (D > \0)

    printf("%d\n", strLength("ABCDe")); // 5

    char sc[30] = "Chinese";
    strConcat(sc, " FUCK Japanese"); puts(sc); // Chinese FUCK Japanese

    char s[] = "I love my homeland";
    strConvert(s); puts(s); // dnalorhd ym evol I
}

記憶體安全提醒

  • strCopy/strConcat 不檢查目的緩衝區大小,實務必用 strncpy/strncat 或 snprintf
  • strReplace 若取代字串較長會越界覆蓋後續記憶體
  • 所有函式假設輸入為合法 C 字串 (以 \0 結尾)

總結

手寫字串函式不只是背誦程式碼,而是要內化「指標走訪 + \0 判斷 + 邊界意識」這三大核心模式。建議在紙上推導每個函式的指標移動軌跡,直到能閉眼寫出為止。

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