在C语言中,字符串通常以字符数组的形式存储,不能直接使用等于号比较两个字符串的内容是否一致,这时候就需要用到strcmp函数来完成字符串的比较操作。strcmp是C语言标准库string.h头文件中提供的函数,主要作用是对两个字符串进行逐字符的ASCII码值比较,从而判断两个字符串的大小关系或者是否相等。

strcmp函数的基本语法
strcmp的函数原型如下,使用时需要先包含string.h头文件:
#include <string.h> int strcmp(const char *str1, const char *str2);
它的两个参数都是指向字符数组的指针,也就是需要比较的两个字符串。函数会对两个字符串从第一个字符开始,逐个比较对应位置字符的ASCII码值,直到遇到不同的字符或者遇到字符串结束符' '为止。
strcmp的返回值规则
strcmp的返回值是一个整数,不同的返回值对应不同的比较结果:
- 如果返回值小于0,说明str1指向的字符串小于str2指向的字符串
- 如果返回值等于0,说明str1指向的字符串和str2指向的字符串完全相等
- 如果返回值大于0,说明str1指向的字符串大于str2指向的字符串
这里的字符串大小比较是按照字符的ASCII码值顺序来的,比如小写字母的ASCII码值比大写字母大,字母a的ASCII码值是97,字母A的ASCII码值是65,所以"abc"会小于"Abc"。
strcmp的使用示例
下面通过几个实际的代码示例来展示strcmp的具体用法:
示例1:判断两个字符串是否相等
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello";
char str2[] = "hello";
char str3[] = "world";
// 比较str1和str2
int result1 = strcmp(str1, str2);
if (result1 == 0) {
printf("str1和str2相等n");
} else {
printf("str1和str2不相等n");
}
// 比较str1和str3
int result2 = strcmp(str1, str3);
if (result2 < 0) {
printf("str1小于str3n");
}
return 0;
}
这段代码的输出结果是:
str1和str2相等 str1小于str3
示例2:字符串排序场景使用strcmp
#include <stdio.h>
#include <string.h>
int main() {
char strs[3][20] = {"banana", "apple", "cherry"};
char temp[20];
// 简单冒泡排序,按字符串升序排列
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2 - i; j++) {
if (strcmp(strs[j], strs[j+1]) > 0) {
// 交换两个字符串
strcpy(temp, strs[j]);
strcpy(strs[j], strs[j+1]);
strcpy(strs[j+1], temp);
}
}
}
printf("排序后的字符串:n");
for (int i = 0; i < 3; i++) {
printf("%sn", strs[i]);
}
return 0;
}
运行后输出:
排序后的字符串: apple banana cherry
使用strcmp的注意事项
在使用strcmp函数的时候,有几个常见的误区需要避开:
- strcmp比较的是字符串的内容,不是字符串的地址,所以不能直接用==比较两个字符数组,==比较的是数组的首地址,永远不可能相等
- 传入strcmp的参数必须是合法的字符串,也就是以' '结尾的字符数组,如果传入没有结束符的字符数组,会导致函数越界访问,出现不可预期的结果
- 不要误以为strcmp的返回值只有-1、0、1三种,标准只规定了小于0、等于0、大于0的规则,不同编译器可能返回不同的具体数值,判断相等的时候一定要用==0,不能用==-1或者==1
- 如果比较的字符串中有中文字符,需要注意编码格式,不同编码下中文字符的字节值不同,strcmp的比较结果可能不符合预期,这种情况不建议用strcmp比较中文内容
注意:如果要忽略大小写比较字符串,可以使用strcasecmp函数(部分编译器支持)或者自己实现忽略大小写的比较逻辑,不要直接用strcmp处理需要忽略大小写的场景。
常见疑问解答
为什么不能用==比较两个字符串?
在C语言中,字符串常量和字符数组名本质上都是指向字符串首地址的指针,使用==比较两个字符串,实际比较的是两个指针存储的地址值,而不是字符串的内容。比如下面的代码:
#include <stdio.h>
int main() {
char str1[] = "test";
char str2[] = "test";
if (str1 == str2) {
printf("相等n");
} else {
printf("不相等n");
}
return 0;
}
这段代码的输出是"不相等",因为str1和str2是两个不同的字符数组,它们的首地址不同,所以==判断的结果是false。
strcmp和strncmp有什么区别?
strncmp是strcmp的变体,多了一个参数用来指定比较的最大字符数,函数原型是int strncmp(const char *str1, const char *str2, size_t n),它只会比较前n个字符,如果前n个字符就出现了不同或者遇到了结束符,就会停止比较,适合需要比较字符串前缀的场景。