strcmp 是 C 標準庫核心函數,按字典序比較兩字符串。本文實現一個簡易版 my_strcmp,並分析常見邏輯錯誤與正確邊界處理。
< 0:s1 < s2== 0:s1 == s2> 0:s1 > s2(unsigned char)*s1 - (unsigned char)*s2)。int my_strcmp(const char *s1, const char *s2) {
assert(s1 && s2);
while (*s1 && *s2 && *s1 == *s2) {
s1++; s2++;
}
return (unsigned char)*s1 - (unsigned char)*s2;
}
邏輯:同步推進指針,直到字符不同或任一遇 \0,最後用字符差值決定大小。
// 原文片段
while ((*str1 == *str2) && *str1 && *str2) { str1++; str2++; }
while (!(*str1 && *str2)) return 1; // 錯誤:邏輯混淆
return -1;
缺陷:
while 條件 !(*str1 && *str2) 意為「至少一個為 \0」,但直接 return 1 錯誤地將「s1 為 s2 前綴」判定為相等。const,違反只讀語義。| s1 | s2 | 預期 | 說明 |
|---|---|---|---|
| "abc" | "abc" | 0 | 完全相等 |
| "abc" | "abcd" | <0 | s1 為 s2 前綴 |
| "abd" | "abc" | >0 | 'd' > 'c' |
| "" | "a" | <0 | 空串最小 |
| "\200" | "\0" | >0 | unsigned char 比較 |
手寫 strcmp 核心就三行:同步推進 → 遇差異或結束 → 返回 unsigned char 差值。注意 const 正確性、unsigned char 轉換避免負值溢位、assert 防禦性編程。