在 C 語言學習中,理解標準庫函數的內部實現機制有助於深入掌握指針操作與字符串處理。本文將詳細講解如何從零手寫 strcmp() 與 strcpy() 兩個核心字符串函數,並分析關鍵邏輯與邊界條件。
strcpy() 的核心任務是將源字符串(包含結束符 \0)完整複製到目標地址。實現要點包括:
assert 確保源、目標指針非空\0char *my_strcpy(char *strDest, const char *strSrc) {
assert((strDest != NULL) && (strSrc != NULL));
char *address = strDest; // 保存起始地址用於返回
while (*strSrc) { // 當源字符不為 '\0' 時循環
*strDest++ = *strSrc++; // 逐字符複製並移動指針
}
*strDest = '\0'; // 補上字符串結束符
return address; // 返回目標字符串起始地址
}
strcmp() 按字典序比較兩字符串,返回值語義如下:
實現邏輯:同步遍歷兩字符串,直到字符不同或任一結束,最後用字符差值決定大小。
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)
}
編寫主函數調用自定義函數,對比標準庫行為:
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;
}

*strDest++ = *strSrc++ 利用後置 ++ 先取值再移動,極其簡潔const 防止誤修改strcpy 返回目標起始地址鏈式調用;strcmp 返回差值滿足三態比較通過手寫這兩個函數,不僅能加深對「指針算術」與「字符串以 \0 結尾」本質的理解,更能體會標準庫設計的嚴謹與高效。