首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言字串比較正確用法:strcmp 函數詳細說明

     編輯:C 語言問答

C 語言字串比較:標準庫 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)) 快速排除
  • 固定長度字串 (如 UUID、哈希值) 用 memcmp 更快 (不檢查結尾符)
  • 現代 CPU 指令集 (SSE/AVX/NEON) 可向量化比較,編譯器 -O2 -march=native 通常自動優化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved