strcmp 正確用法不能用 == 比較字串,== 比較的是指標位址,而非字串內容。
#include <string.h>
char s1[100], s2[100];
// ... 讀取字串 ...
if (strcmp(s1, s2) == 0) {
printf("兩字串相等\n");
} else if (strcmp(s1, s2) < 0) {
printf("s1 字典序小於 s2\n");
} else {
printf("s1 字典序大於 s2\n");
}
strcmp 回傳值規則| 回傳值 | 含義 |
|---|---|
0 | 兩字串完全相等 |
< 0 | 第一個不相同字元處,s1 的 ASCII 碼小於 s2 |
> 0 | 第一個不相同字元處,s1 的 ASCII 碼大於 s2 |
| 函數 | 用途 | 標準 |
|---|---|---|
strncmp(s1, s2, n) | 比較前 n 字元 | C89 |
strcasecmp(s1, s2) | 忽略大小寫比較 (POSIX) | POSIX / BSD |
strncasecmp(s1, s2, n) | 忽略大小寫比較前 n 字元 | POSIX |
strcmpi(s1, s2) | 忽略大小寫 (Windows/MSVC 專用) | 非標準 |
strcmp 教學實作int my_strcmp(const char* s1, const char* s2) {
while (*s1 && *s2 && *s1 == *s2) {
s1++; s2++;
}
return (unsigned char)*s1 - (unsigned char)*s2;
}
關鍵細節:轉為 unsigned char 再相減,避免 char 有號號時負值相減導致未定義行為。
if (s1 == s2) — 比較指標位址if (strcmp(s1, s2)) — 忘記 == 0,非零視為真,邏輯反轉<string.h> — 隱式宣告警告'\0' 結尾的字元陣列 — 未定義行為if (strlen(s1) != strlen(s2)) 快速排除memcmp 更快 (不檢查結尾符)-O2 -march=native 通常自動優化