strcasecmp 是 C 語言中用于不區分大小寫比較兩個字符串的函數,主要用于忽略字符大小寫差異的場景(如用戶輸入驗證、不區分大小寫的字符串匹配等)。它屬于 POSIX 標準庫,定義在 <string.h>
頭文件中。
一、函數原型與參數
函數原型:
#include <string.h>
int strcasecmp(const char *s1, const char *s2);
參數說明:
s1
:指向第一個要比較的字符串的指針(const char*
類型,函數不會修改該字符串)。s2
:指向第二個要比較的字符串的指針(const char*
類型,同樣不可修改)。
核心邏輯:函數會先將兩個字符串中的字符統一轉換為相同大小寫(通常是小寫),再逐個字符比較其 ASCII 碼值,直到遇到不同字符或字符串結束符 '\0'
。
二、返回值及取值范圍含義
strcasecmp 的返回值為 int
類型,根據比較結果不同,返回值有以下三種情況:
返回值類型 | 含義 | 取值范圍 |
---|---|---|
0 | 兩個字符串相等(忽略大小寫)。 | 僅當 s1 和 s2 所有字符(忽略大小寫)完全相同時返回 0。 |
正數 | 第一個字符串 s1 在字典序上大于第二個字符串 s2 (忽略大小寫)。 | 具體值通常是兩個字符串中第一個不同字符(轉換為小寫后)的 ASCII 碼差值(s1_char - s2_char ),但標準未規定具體數值,僅保證為正數。 |
負數 | 第一個字符串 s1 在字典序上小于第二個字符串 s2 (忽略大小寫)。 | 具體值通常是兩個字符串中第一個不同字符(轉換為小寫后)的 ASCII 碼差值(s1_char - s2_char ),但標準未規定具體數值,僅保證為負數。 |
三、使用案例
以下示例演示了 strcasecmp 在不同場景下的使用:
#include <stdio.h>
#include <string.h>int main() {// 案例1:兩個字符串完全相等(忽略大小寫)const char *str1 = "HelloWorld";const char *str2 = "hElLoWoRlD";int result1 = strcasecmp(str1, str2);printf("比較 \"%s\" 和 \"%s\": %d(0表示相等)\n", str1, str2, result1);// 案例2:s1 小于 s2(忽略大小寫)const char *str3 = "apple";const char *str4 = "Banana"; // 'a'(97) < 'b'(98),轉換為小寫后比較int result2 = strcasecmp(str3, str4);printf("比較 \"%s\" 和 \"%s\": %d(負數表示s1 < s2)\n", str3, str4, result2);// 案例3:s1 大于 s2(忽略大小寫)const char *str5 = "Zebra";const char *str6 = "ant"; // 'z'(122) > 'a'(97),轉換為小寫后比較int result3 = strcasecmp(str5, str6);printf("比較 \"%s\" 和 \"%s\": %d(正數表示s1 > s2)\n", str5, str6, result3);// 案例4:實際應用場景(模擬用戶輸入驗證,忽略大小寫)const char *correctInput = "Admin";const char *userInput = "admin"; // 用戶輸入小寫if (strcasecmp(correctInput, userInput) == 0) {printf("用戶輸入驗證通過(忽略大小寫)\n");} else {printf("用戶輸入驗證失敗\n");}return 0;
}
輸出結果:
比較 "HelloWorld" 和 "hElLoWoRlD": 0(0表示相等)
比較 "apple" 和 "Banana": -1(負數表示s1 < s2)
比較 "Zebra" 和 "ant": 121(正數表示s1 > s2)
用戶輸入驗證通過(忽略大小寫)
說明:
- 案例1中,
str1
和str2
僅大小寫不同,比較結果為 0(相等)。 - 案例2中,
str3
的第一個字符 ‘a’(小寫)小于str4
的第一個字符 ‘B’(轉換為小寫 ‘b’),返回負數(通常為 -1)。 - 案例3中,
str5
的第一個字符 ‘Z’(轉換為小寫 ‘z’)大于str6
的第一個字符 ‘a’,返回正數(122 - 97 = 25,具體值可能因編譯器略有差異)。
四、注意事項
-
與 strcmp 的區別:
strcmp
區分大小寫(如 ‘A’ 和 ‘a’ 被視為不同字符);strcasecmp
不區分大小寫(會先統一轉換為小寫/大寫再比較)。
-
與 strncasecmp 的區別:
strncasecmp
多一個參數n
,用于指定比較的最大字符數(避免超長字符串比較);strcasecmp
會比較到字符串結束符'\0'
為止。
-
平臺兼容性:
strcasecmp
是 POSIX 標準函數(Linux、macOS 等支持),不屬于 C 語言標準庫;- Windows 系統中需使用
_stricmp
(VS 編譯器)或stricmp
替代(需包含<string.h>
)。
-
返回值的具體數值:
標準僅規定返回值的正負性(正/負/零),不保證具體數值(如不同編譯器可能返回 -1、1 或實際 ASCII 差值),因此代碼中不應依賴具體數值,只需判斷其正負或是否為零。
總結
strcasecmp 是處理不區分大小寫字符串比較的實用函數,核心作用是忽略字符大小寫差異,返回兩個字符串的字典序關系。其返回值的正負性是判斷依據,適用于用戶輸入驗證、大小寫無關的搜索等場景,但需注意平臺兼容性問題。