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; }