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

手把手實現 C 標準庫字串函數:strlen、strcpy、strcmp、strcat

     編輯:關於C語言

手把手實現 C 標準庫字串函數:strlen、strcpy、strcmp、strcat

深入理解標準庫函數內部邏輯,不僅能應對面試,更能在嵌入式、裸機等無標準庫環境下自給自足。本文從零實現四大核心字串函數,附帶邊界檢查與測試用例。

1. my_strlen —— 計算字串長度

int my_strlen(const char *pStr) {
    assert(pStr != NULL);
    int len = 0;
    while (*pStr++ != '\0') len++;
    return len;
}
  • 輸入 const char* 保護原字串不被修改。
  • 利用指針遞增遍歷,遇 \0 停止。
  • 時間複雜度 O(n),空間 O(1)。

2. my_strcpy —— 字串拷貝

char *my_strcpy(char *strDest, const char *strSrc) {
    assert(strDest != NULL && strSrc != NULL);
    char *pDest = strDest;
    const char *pSrc = strSrc;
    while (*pSrc != '\0') {
        *pDest++ = *pSrc++;
    }
    *pDest = '\0';  // 標準 strcpy 會拷貝結束符
    return strDest; // 返回目的地址,鏈式調用
}
  • 保存 strDest 以便返回。
  • 逐字符拷貝含結束符,調用者必須確保目的緩衝區足夠大,否則緩衝區溢出(測試代碼中註釋的 my_strcpy(c1, c3) 會崩潰)。

3. my_strcmp —— 字串比較

int my_strcmp(const char *strDest, const char *strSrc) {
    assert(strDest != NULL && strSrc != NULL);
    const char *pDest = strDest, *pSrc = strSrc;
    int result = 0;
    while (*pDest != '\0' || *pSrc != '\0') {
        if ((result = *pDest - *pSrc) != 0) break;
        pDest++; pSrc++;
    }
    if (result > 0) return 1;
    if (result < 0) return -1;
    return 0;
}
  • 按字符碼值逐個比較,首個差異決定大小。
  • 返回值語義:>0(正)、=0(等)、<0(負),標準庫僅保證符號,不保證具體值,此處歸一化為 1/0/-1。

4. my_strcat —— 字串連接

char *my_strcat(char *strDest, char *strSrc) {
    assert(strDest != NULL && strSrc != NULL);
    char *pDest = strDest, *pSrc = strSrc;
    while (*pDest != '\0') pDest++;  // 定位到結束符
    while (*pSrc != '\0') *pDest++ = *pSrc++;
    *pDest = '\0';
    return strDest;
}
  • 先找到 strDest 末尾,再追加 strSrc。
  • 同樣要求目的緩衝區足夠大。

測試驅動代碼

void Test() {
    char c1[5] = "abcd";
    char c2[4] = "123";
    char c3[20] = "123456";

    printf("c1-length: %d\n", my_strlen(c1));
    printf("my_strcpy(c1,c2): %s\n", my_strcpy(c1, c2));
    // printf("%s\n", my_strcpy(c1, c3)); // 緩衝區溢出,會崩潰!!
    printf("my_strcmp(c1,c2): %d\n", my_strcmp(c1, c2));
    printf("my_strcmp(c2,c3): %d\n", my_strcmp(c2, c3));
    printf("my_strcat(c3,c2): %s\n", my_strcat(c3, c2));
}

核心心法總結

  1. 斷言防禦:assert(ptr != NULL) 捕獲空指針錯誤。
  2. 指針備份:操作前保存原始指針(pDest = strDest),用於返回或後續計算。
  3. 結束符處理:strcpy/strcat 必須顯式寫入 \0。
  4. 緩衝區責任:標準庫不檢查邊界,調用者必須確保目標空間足夠(如 strncpy、strncat 提供長度限制版本)。
  5. const 正確性:源字串用 const,目的字串非 const。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved