在 C 语言编程中字符串比较是高频操作——判断用户名是否匹配、校验密码、排序字符串数组等场景都离不开它。而 strcmp 函数 就是 C 标准库提供的、专门用于逐字符比较两个字符串的工具是字符串处理的核心函数之一。

今天我们就从函数原型、核心原理、返回值规则、使用示例、底层原理、注意事项六个方面彻底吃透 strcmp。
strcmp 全称是 string compare字符串比较定义在 C 标准头文件 <string.h> 中使用前必须包含该头文件。
// 头文件 #include <string.h> // 函数原型 int strcmp(const char *str1, const char *str2);
str1第一个要比较的字符串加 const 常量指针保证函数内不会修改原字符串str2第二个要比较的字符串 结尾符合 C 语言字符串规范strcmp 会从两个字符串的第一个字符开始逐字符比较它们的 ASCII 码值
若所有字符都相等返回相等结果。strcmp 的返回值是 int 类型只有三种情况是判断字符串关系的唯一依据
| 返回值范围 | 含义 | 示例 |
|---|---|---|
| 等于 0 | str1 和 str2 完全相等 | "abc" vs "abc" |
| 小于 0 | str1 小于 str2 | "app" vs "apple"、"abc" vs "abd" |
| 大于 0 | str1 大于 str2 | "zoo" vs "cat"、"123" vs "12" |
关键补充
'A'(65) < 'a'(97)我们通过 4 个经典案例直观感受 strcmp 的用法
#include <stdio.h>
#include <string.h> // 必须包含
int main()
{
char str1[] = "hello";
char str2[] = "hello";
// 调用strcmp比较
int result = strcmp(str1, str2);
if (result == 0)
{
printf("str1 和 str2 相等n"); // 输出结果
}
else if (result < 0)
{
printf("str1 小于 str2n");
}
else
{
printf("str1 大于 str2n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
// 'a'(97) < 'b'(98)所以返回值 < 0
printf("比较结果%dn", result); // 输出负数
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Hello";
char str2[] = "hello";
int result = strcmp(str1, str2);
// 'H'(72) < 'h'(104)返回负数
if (result != 0)
{
printf("字符串不相等区分大小写n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
char correct_user[] = "admin"; // 正确用户名
char input_user[20]; // 用户输入
printf("请输入用户名");
scanf("%s", input_user);
// 用strcmp校验用户名
if (strcmp(input_user, correct_user) == 0)
{
printf("登录成功n");
}
else
{
printf("用户名错误n");
}
return 0;
}
很多新手会犯这个错
char *str1 = "hello"; char *str2 = "hello"; if (str1 == str2) // 比较的是地址不是内容
原因str1 和 str2 是字符数组名本质是数组首地址== 比较的是两个字符串的内存地址不是内容。只有地址相同才会返回真内容相同地址不同时结果一定错误。
正确做法必须用 strcmp 比较字符串内容。
strcmp 依赖 判断字符串结束如果传入非字符串字符数组无 会导致越界访问程序崩溃。
错误示例
// 没有不是合法字符串
char str1[] = {'a', 'b', 'c'};
char str2[] = {'a', 'b', 'c'};
strcmp(str1, str2); // 未定义行为
如果传入 NULL 指针strcmp 会直接访问非法内存程序崩溃。
安全写法先判断指针是否为空
if (str1 != NULL && str2 != NULL)
{
strcmp(str1, str2);
}
单个字符直接用 ==、<、> 比较即可无需调用函数
// 正确
char a = 'a', b = 'b';
if (a < b) { ... }
了解内部实现有助于避开陷阱。一个标准的 strcmp 实现如下
int my_strcmp(const char *s1, const char *s2)
{
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
return *(unsigned char*)s1 - *(unsigned char*)s2;
}
代码剖析
unsigned char 保证非负字符比较的正确性避免 char 默认有符号导致负数问题C 语言还提供了 strncmp 函数用于比较前 n 个字符适合只需要比较部分字符串的场景
int strncmp(const char *str1, const char *str2, size_t n);
strcmp比较整个字符串直到 strncmp最多比较 n 个字符更安全避免长字符串越界。示例
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "apple";
char str2[] = "app";
// 调用strncmp比较: 只比较前3个字符结果相等
int result = strncmp(str1, str2, 3); // 返回0
if (result == 0)
{
printf("str1 和 str2 相等n"); // 输出结果
}
else if (result < 0)
{
printf("str1 小于 str2n");
}
else
{
printf("str1 大于 str2n");
}
return 0;
}
strcmp 是 C 标准库函数头文件 <string.h>用于逐字符比较字符串内容==掌握 strcmp 是 C 语言字符串处理的基础熟练使用能避免 90% 的字符串比较错误赶紧动手试试吧
以上就是C语言使用strcmp函数进行字符串比较的方法详解的详细内容更多关于C语言strcmp字符串比较的资料请关注本站其它相关文章
您可能感兴趣的文章: