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

手寫 C 庫函式:strcmp 與 strcpy 實現細節與邊界處理

     編輯:C 語言入門

strcpy 實現要點

  • 檢查空指標(斷言或返回)。
  • 逐字元複製含結尾 '\0'。
  • 返回目的地址(鏈式呼叫慣例)。
  • 重疊記憶體未定義(需用 memmove)。

標準實現

char *my_strcpy(char *dest, const char *src) {
    assert(dest && src);
    char *ret = dest;
    while ((*dest++ = *src++) != '\0');
    return ret;
}

strcmp 實現要點

  • 逐字元比較 unsigned char 值(避免符號擴展)。
  • 遇不同或 '\0' 停止。
  • 返回差值:*s1 - *s2(正/負/零)。

標準實現

int my_strcmp(const char *s1, const char *s2) {
    assert(s1 && s2);
    while (*s1 && *s1 == *s2) { ++s1; ++s2; }
    return (unsigned char)*s1 - (unsigned char)*s2;
}

測試主程式

int main(void) {
    char s1[] = "Hello";
    char s2[] = "World!";
    printf("strcmp: %d\n", my_strcmp(s1, s2)); // 負值
    printf("strcpy: %s\n", my_strcpy(s1, s2)); // World!
    return 0;
}

常見錯誤對照

錯誤寫法問題修正
while(*src) *dest++ = *src++;漏複製 '\0'while((*dest++ = *src++));
return *s1 - *s2;有號字元相減可能溢位/錯誤return (unsigned char)*s1 - (unsigned char)*s2;
無 assert/空指標檢查傳入 NULL 直接崩潰加入防禦性檢查
重疊區域用 strcpy行為未定義改用 memmove

效能優化提示

  • 對齊記憶體時可按 sizeof(unsigned long) 分塊複製(glibc 做法)。
  • 編譯器內建 __builtin_strcpy 會自動向量化。
  • 教學/面試場景以清晰正確為優先,生產環境直接用標準庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved