C语言 字符串的比较问题

C语言中,字符串是以字符数组的形式存储的,并且以空字符 \0 结尾。C语言中没有内建的字符串类型,所以不能直接用 == 来比较两个字符串(字符数组)。要比较两个字符串是否相等,或者判断它们的字典序大小关系,应该使用标准库函数 strcmp() 或类似的函数。

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

注意:str1str2 是不同数组的首地址,所以即使它们的内容相同,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; 
} 

推荐阅读
cjavapy编程之路首页