strcmp(s1, s2) 按字符 ASCII 碼逐個比較,遇到不同字符即返回差值;若前缀完全相同,則長字符串大於短字符串(因 \0 < 任何可見字符)。
< 0:s1 < s2== 0:s1 == s2> 0:s1 > s2| s1 | s2 | 比較過程 | 結果 |
|---|---|---|---|
| "ABC" | "AB" | 'A'='A', 'B'='B', 'C' > '\0' | >0 (ABC > AB) |
| "AEF" | "AG" | 'A'='A', 'E' (69) < 'G' (71) | <0 (AEF < AG) |
| "abc" | "ABC" | 'a' (97) > 'A' (65) | >0 (區分大小寫) |
| "hello\0world" | "hello" | 前 5 字符相同,s1 第 6 字符 'w' > '\0' | >0 |
int my_strcmp(const char* s1, const char* s2) {
while (*s1 && (*s1 == *s2)) { s1++; s2++; }
return (unsigned char)*s1 - (unsigned char)*s2; // 強制無符號避免溢出
}
== 比較字符串:比較的是地址而非內容;'A' (65) != 'a' (97),需不區分大小寫請用 strcasecmp (POSIX) 或自寫;"ab\0cd" 實際長度為 2,比較時在 \0 停止;
// 只比較前 n 字符,防止讀越界
if (strncmp(buf, "CMD:", 4) == 0) { /* 處理命令 */ }