strcmp 函数
strcmp (string compare) 函数用于字典序(Lexicographical order)比较两个字符串。

函数原型
#include <string.h> int strcmp(const char *str1, const char *str2);
参数
str1: 第一个要比较的字符串。str2: 第二个要比较的字符串。
返回值
strcmp 的返回值是一个整数,其含义如下:
-
返回值 < 0: 表示
str1小于str2。- 这意味着在字典中,
str1出现在str2的前面。 strcmp("apple", "banana")会返回一个负数。
- 这意味着在字典中,
-
返回值 = 0: 表示
str1等于str2。- 这意味着两个字符串的每一个字符都完全相同。
strcmp("hello", "hello")会返回0。
-
返回值 > 0: 表示
str1大于str2。
(图片来源网络,侵删)- 这意味着在字典中,
str1出现在str2的后面。 strcmp("banana", "apple")会返回一个正数。
- 这意味着在字典中,
工作原理
strcmp 会从左到右逐个字符比较 str1 和 str2 的 ASCII 码值,直到遇到以下情况之一:
- 发现两个字符不相等,立即返回这两个字符的 ASCII 码值之差。
- 到达其中一个字符串的末尾(遇到
\0字符)。 - 两个字符串同时到达末尾(即完全相等)。
代码示例
下面是一个完整的示例,展示了 strcmp 的不同用法和返回值。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
char str3[] = "apple";
char str4[] = "Apple"; // 'A' (65) 的 ASCII 码小于 'a' (97)
char str5[] = "apples";
// 情况1: str1 < str2
int result1 = strcmp(str1, str2);
printf("strcmp(\"%s\", \"%s\") = %d\n", str1, str2, result1); // 输出: -1 (或一个负数)
// 情况2: str1 == str3
int result2 = strcmp(str1, str3);
printf("strcmp(\"%s\", \"%s\") = %d\n", str1, str3, result2); // 输出: 0
// 情况3: str2 > str1
int result3 = strcmp(str2, str1);
printf("strcmp(\"%s\", \"%s\") = %d\n", str2, str1, result3); // 输出: 1 (或一个正数)
// 情况4: 大小写敏感比较 ('A' < 'a')
int result4 = strcmp(str4, str1);
printf("strcmp(\"%s\", \"%s\") = %d\n", str4, str1, result4); // 输出: 一个负数 (65 - 97 = -32)
// 情况5: 一个字符串是另一个的前缀 ("apple" < "apples")
int result5 = strcmp(str1, str5);
printf("strcmp(\"%s\", \"%s\") = %d\n", str1, str5, result5); // 输出: 一个负数
return 0;
}
注意:strcmp 返回的具体负数或正数值取决于第一个不相等字符的 ASCII 码差,在大多数现代实现中,它通常只返回 -1、0 或 1,但 C 语言标准只规定其符号(小于、等于、大于),不规定具体数值,在编程中,我们通常只关心返回值的符号,而不是具体数值。
strncmp 函数
strcmp 会比较到字符串的末尾,如果你只想比较字符串的前 n 个字符,可以使用 strncmp 函数。

函数原型
#include <string.h> int strncmp(const char *str1, const char *str2, size_t n);
参数
str1,str2: 要比较的两个字符串。n: 要比较的最大字符数。
返回值
返回值规则与 strcmp 完全相同:负数、零或正数。
代码示例
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "applepie";
char str2[] = "appletree";
// 比较 5 个字符
int result = strncmp(str1, str2, 5);
printf("strncmp(\"%s\", \"%s\", 5) = %d\n", str1, str2, result); // 输出: 0,因为前5个字符 "apple" 相同
// 比较 6 个字符
result = strncmp(str1, str2, 6);
printf("strncmp(\"%s\", \"%s\", 6) = %d\n", str1, str2, result); // 输出: 一个负数,因为第6个字符 'p' < 't'
return 0;
}
常见错误与注意事项
错误:比较字符串内容时使用
这是 C 语言初学者最常见的错误之一。
错误示例:
char str1[] = "hello";
char str2[] = "hello";
if (str1 == str2) { // 错误!
printf("Strings are equal.\n");
}
原因:在 C 语言中,str1 和 str2 是数组名,在表达式中会“退化”为指向数组首元素的指针(即内存地址)。str1 == str2 实际上是比较两个字符串的内存地址是否相同,而不是比较它们的内容是否相同,由于 str1 和 str2 是两个不同的数组,它们在内存中的地址也必然不同,所以这个判断永远不会为真。
正确做法:
if (strcmp(str1, str2) == 0) {
printf("Strings are equal.\n");
}
注意事项:大小写敏感
strcmp 是大小写敏感的,这意味着 "Hello" 和 "hello" 会被判定为不相等。
如果你需要进行不区分大小写的比较,可以使用 C 标准库中的 strcasecmp 函数(在 POSIX 系统如 Linux/macOS 上可用)或 _stricmp(在 Windows 系统上可用)。
// Linux/macOS
#include <strings.h>
strcasecmp("Hello", "hello"); // 返回 0
// Windows
#include <string.h>
_stricmp("Hello", "hello"); // 返回 0
| 函数 | 功能 | 返回值 |
|---|---|---|
strcmp |
比较两个字符串的全部内容 | < 0 (str1 < str2), 0 (str1 == str2), > 0 (str1 > str2) |
strncmp |
比较两个字符串的前 n 个字符 |
同 strcmp |
strcasecmp / _stricmp |
不区分大小写地比较两个字符串 | 同 strcmp |
strcmp 是比较字符串内容的正确工具,永远不要用 来比较字符串。
