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

C語言手動實現 strcmp() 與 strcpy() 函數詳解

     編輯:關於C語言

C語言手動實現 strcmp() 與 strcpy() 函數詳解

在 C 語言學習中,理解標準庫函數的內部實現機制有助於深入掌握指針操作與字符串處理。本文將詳細講解如何從零手寫 strcmp() 與 strcpy() 兩個核心字符串函數,並分析關鍵邏輯與邊界條件。

1. 手寫 strcpy() - 字符串複製

strcpy() 的核心任務是將源字符串(包含結束符 \0)完整複製到目標地址。實現要點包括:

  • 參數校驗:使用 assert 確保源、目標指針非空
  • 保存目標起始地址以便返回
  • 逐字符複製直到遇到 \0
  • 最後補上結束符並返回起始地址
char *my_strcpy(char *strDest, const char *strSrc) {
    assert((strDest != NULL) && (strSrc != NULL));
    char *address = strDest;           // 保存起始地址用於返回
    while (*strSrc) {                  // 當源字符不為 '\0' 時循環
        *strDest++ = *strSrc++;        // 逐字符複製並移動指針
    }
    *strDest = '\0';                   // 補上字符串結束符
    return address;                    // 返回目標字符串起始地址
}

2. 手寫 strcmp() - 字符串比較

strcmp() 按字典序比較兩字符串,返回值語義如下:

  • 負值:str1 < str2
  • 0:str1 == str2
  • 正值:str1 > str2

實現邏輯:同步遍歷兩字符串,直到字符不同或任一結束,最後用字符差值決定大小。

int my_strcmp(const char *str1, const char *str2) {
    assert((str1 != NULL) && (str2 != NULL));
    while (*str1 && *str2 && (*str1 == *str2)) {
        str1++;
        str2++;
    }
    return *str1 - *str2;  // 直接返回字符差值(隱含轉為 int)
}

3. 測試驗證

編寫主函數調用自定義函數,對比標準庫行為:

int main() {
    char str1[] = "Hello";
    char str2[] = "World!";
    printf("strcmp 結果: %d\n", my_strcmp(str1, str2));  // 應為負值
    printf("strcpy 結果: %s\n", my_strcpy(str1, str2));  // 輸出 "World!"
    return 0;
}

程序運行輸出截圖

4. 核心注意事項總結

  1. 指針遞增順序:*strDest++ = *strSrc++ 利用後置 ++ 先取值再移動,極其簡潔
  2. const 正確性:源字符串標記 const 防止誤修改
  3. 返回值設計:strcpy 返回目標起始地址鏈式調用;strcmp 返回差值滿足三態比較
  4. 斷言防禦:生產代碼建議改為運行時檢查並返回錯誤碼

通過手寫這兩個函數,不僅能加深對「指針算術」與「字符串以 \0 結尾」本質的理解,更能體會標準庫設計的嚴謹與高效。

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