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 會自動向量化。
- 教學/面試場景以清晰正確為優先,生產環境直接用標準庫。