strcmp 是什么?
strcmp 是 C 标准库中的一个函数,它的全称是 "string compare"(字符串比较),它的主要作用是逐个字符地比较两个字符串,并根据比较结果返回一个整数值。

(图片来源网络,侵删)
函数原型
strcmp 函数通常在 <string.h> 头文件中声明,它的原型如下:
int strcmp(const char *str1, const char *str2);
- 参数:
str1: 指向第一个字符串的指针。str2: 指向第二个字符串的指针。
- 返回值:
- 返回一个整数值,这个整数值有三种可能:
- 小于 0 (
str1小于str2) - 等于 0 (
str1等于str2) - 大于 0 (
str1大于str2)
- 小于 0 (
- 返回一个整数值,这个整数值有三种可能:
比较规则(非常重要!)
strcmp 的比较是基于字符的 ASCII 码值 进行的,它会从字符串的开头开始,逐个字符进行比较:
-
找到第一个不匹配的字符:比较
str1和str2中对应位置上的字符。- 如果这两个字符的 ASCII 码值不同,函数就立即返回它们的差值(
str1的字符ASCII码 - str2的字符ASCII码)。 - 比较 "apple" 和 "banana":
- 第一个字符 'a' (97) 和 'b' (98) 不同。
- 函数返回
97 - 98 = -1。
- 如果这两个字符的 ASCII 码值不同,函数就立即返回它们的差值(
-
到达字符串结尾:如果所有对应字符都相同,但其中一个字符串先结束(即遇到了空字符
\0)。
(图片来源网络,侵删)- 较短的字符串被认为“小于”较长的字符串。
- 比较 "hello" 和 "hello world":
- 前 5 个字符都相同。
- "hello" 到达了结尾
\0,而 "hello world" 还有字符。 - 函数返回
0 - 'w'(一个负数),表示 "hello" < "hello world"。
-
完全相同:如果两个字符串长度相同,并且所有对应字符都相同,直到都遇到
\0。- 函数返回
0。 - 比较 "world" 和 "world":
- 所有字符都相同,同时结束。
- 函数返回
0。
- 函数返回
使用示例
下面是一个完整的 C 语言程序,展示了 strcmp 的几种典型用法。
#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用 strcmp
int main() {
char str1[] = "apple";
char str2[] = "banana";
char str3[] = "apple";
char str4[] = "APPLE"; // 注意大小写
char str5[] = "apples";
// 示例 1: str1 < str2
int result1 = strcmp(str1, str2);
printf("比较 \"%s\" 和 \"%s\":\n", str1, str2);
if (result1 < 0) {
printf(" 结果: \"%s\" 小于 \"%s\" (返回值: %d)\n", str1, str2, result1);
} else if (result1 > 0) {
printf(" 结果: \"%s\" 大于 \"%s\" (返回值: %d)\n", str1, str2, result1);
} else {
printf(" 结果: \"%s\" 等于 \"%s\" (返回值: %d)\n", str1, str2, result1);
}
printf("\n");
// 示例 2: str1 == str3
int result2 = strcmp(str1, str3);
printf("比较 \"%s\" 和 \"%s\":\n", str1, str3);
if (result2 == 0) {
printf(" 结果: \"%s\" 等于 \"%s\" (返回值: %d)\n", str1, str3, result2);
}
printf("\n");
// 示例 3: str1 > str4 (大小写敏感)
int result3 = strcmp(str1, str4);
printf("比较 \"%s\" 和 \"%s\":\n", str1, str4);
if (result3 > 0) {
printf(" 结果: \"%s\" 大于 \"%s\" (返回值: %d)\n", str1, str4, result3);
printf(" 原因: 'a' (97) 的 ASCII 码大于 'A' (65)\n");
}
printf("\n");
// 示例 4: str1 < str5 (长度不同)
int result4 = strcmp(str1, str5);
printf("比较 \"%s\" 和 \"%s\":\n", str1, str5);
if (result4 < 0) {
printf(" 结果: \"%s\" 小于 \"%s\" (返回值: %d)\n", str1, str5, result4);
printf(" 原因: \"apple\" 是 \"apples\" 的前缀,所以更短\n");
}
return 0;
}
程序输出:
比较 "apple" 和 "banana":
结果: "apple" 小于 "banana" (返回值: -1)
比较 "apple" 和 "apple":
结果: "apple" 等于 "apple" (返回值: 0)
比较 "apple" 和 "APPLE":
结果: "apple" 大于 "APPLE" (返回值: 32)
原因: 'a' (97) 的 ASCII 码大于 'A' (65)
比较 "apple" 和 "apples":
结果: "apple" 小于 "apples" (返回值: -115)
原因: "apple" 是 "apples" 的前缀,所以更短
(注意:不同编译器或平台下,返回的差值可能不完全一样,但 <0, ==0, >0 的关系是确定的。)

(图片来源网络,侵删)
常见错误和注意事项
错误用法:if (strcmp(str1, str2))
这是一个非常常见的错误,初学者可能会这样写:
// 错误示例!
if (strcmp(str1, str2)) {
printf("字符串不相等\n");
}
为什么是错误的?
- 当
strcmp返回0(表示字符串相等)时,if (0)的条件为 假,代码块不会执行。 - 当
strcmp返回非零值(表示字符串不相等)时,if (非零值)的条件为 真,代码块会执行。
这导致了逻辑上的完全相反:你本想在字符串相等时执行某些操作,但实际上却在它们不相等时执行了。
正确用法
你应该明确地检查返回值是否等于 0:
// 正确用法 1: 检查是否相等
if (strcmp(str1, str2) == 0) {
printf("字符串相等\n");
}
// 正确用法 2: 检查是否不相等
if (strcmp(str1, str2) != 0) {
printf("字符串不相等\n");
}
// 正确用法 3: 检查 str1 是否小于 str2
if (strcmp(str1, str2) < 0) {
printf("str1 小于 str2\n");
}
strcmp 的不区分大小写版本
你可能希望比较 "Apple" 和 "apple" 时认为它们是相等的,C 标准库提供了另一个函数 strcasecmp(在 Linux/macOS 上)或 _stricmp(在 Windows 上)来实现不区分大小写的比较。
注意:这些函数不是标准 C 的一部分,在不同平台上的名称可能不同,使用时需要查阅特定平台的文档。
Linux/macOS 示例 (strcasecmp)
#include <stdio.h>
#include <strings.h> // 注意头文件是 strings.h
int main() {
char str1[] = "Apple";
char str2[] = "apple";
int result = strcasecmp(str1, str2);
if (result == 0) {
printf("不区分大小写比较: \"%s\" 等于 \"%s\"\n", str1, str2);
}
return 0;
}
| 函数 | 头文件 | 功能 | 返回值 |
|---|---|---|---|
strcmp |
<string.h> |
区分大小写的字符串比较 | <0, ==0, >0 |
strcasecmp (Linux/macOS) |
<strings.h> |
不区分大小写的字符串比较 | <0, ==0, >0 |
_stricmp (Windows) |
<string.h> |
不区分大小写的字符串比较 | <0, ==0, >0 |
strcmp 的核心是按 ASCII 码逐字符比较,并且一定要检查返回值是否等于 0 来判断字符串是否相等。
