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 是处理不区分大小写字符串比较的实用函数,核心作用是忽略字符大小写差异,返回两个字符串的字典序关系。其返回值的正负性是判断依据,适用于用户输入验证、大小写无关的搜索等场景,但需注意平台兼容性问题。