1、使用 strcmp() 函数
strcmp()
是 C 标准库中用于比较两个字符串的函数,定义在 string.h
头文件中。strcmp()
按照字典序逐个比较两个字符串中的字符,直到遇到不同的字符或者遇到字符串的终止字符\0
。它比较的是每个字符的 ASCII 值。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello";
char str2[] = "world";
char str3[] = "hello";
// 比较 str1 和 str2
if (strcmp(str1, str2) == 0) {
printf("str1 and str2 are equal.\n");
} else {
printf("str1 and str2 are not equal.\n");
}
// 比较 str1 和 str3
if (strcmp(str1, str3) == 0) {
printf("str1 and str3 are equal.\n");
} else {
printf("str1 and str3 are not equal.\n");
}
return 0;
}
2、不能使用 == 比较字符串的原因
在 C 中,字符串是通过字符数组来表示的,而数组名本质上是指向数组首元素的指针。使用 ==
比较两个字符串时,实际上是在比较这两个指针的地址,而不是比较字符串的内容。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello";
char str2[] = "hello";
// 使用 == 比较的是指针地址
if (str1 == str2) {
printf("这不会按预期工作!\n");
} else {
printf("str1 和 str2 的内存地址不同。\n");
}
// 使用 strcmp 比较字符串内容
if (strcmp(str1, str2) == 0) {
printf("str1 和 str2 的内容相同。\n");
} else {
printf("str1 和 str2 的内容不同。\n");
}
return 0;
}
注意:str1
和 str2
是不同数组的首地址,所以即使它们的内容相同,str1 == str2
也会返回 false
,因为它比较的是数组的地址而不是内容。
3、略大小写的字符串比较
如果需要在比较字符串时忽略大小写,可以使用 strcasecmp()
函数(在POSIX系统上可用,Windows上可用 _stricmp()
)。这个函数的用法与 strcmp()
类似。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "hello";
// 使用 strcasecmp 比较忽略大小写
if (strcasecmp(str1, str2) == 0) {
printf("str1 和 str2 相等(忽略大小写)。\n");
} else {
printf("str1 和 str2 不相等(忽略大小写)。\n");
}
return 0;
}
4、自己实现 strcmp() 函数
自己实现 strcmp()
函数,可以逐个比较两个字符串中的字符,直到遇到不同的字符或其中一个字符串结束。如果遇到不同的字符,返回它们的ASCII码差值。如果两个字符串都结束且没有不同的字符,返回0
。
#include <stdio.h>
int my_strcmp(const char *str1, const char *str2) {
while (*str1 && (*str1 == *str2)) {
str1++;
str2++;
}
return *(const unsigned char*)str1 - *(const unsigned char*)str2;
}
int main() {
char str1[] = "hello";
char str2[] = "world";
char str3[] = "hello";
printf("Comparing '%s' and '%s': %d\n", str1, str2, my_strcmp(str1, str2));
printf("Comparing '%s' and '%s': %d\n", str1, str3, my_strcmp(str1, str3));
return 0;
}