strcmp函数如何正确使用?

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 C语言 正文

strcmp 是什么?

strcmp 是 C 标准库中的一个函数,它的全称是 "string compare"(字符串比较),它的主要作用是逐个字符地比较两个字符串,并根据比较结果返回一个整数值。

c语言中strcmp怎么用
(图片来源网络,侵删)

函数原型

strcmp 函数通常在 <string.h> 头文件中声明,它的原型如下:

int strcmp(const char *str1, const char *str2);
  • 参数:
    • str1: 指向第一个字符串的指针。
    • str2: 指向第二个字符串的指针。
  • 返回值:
    • 返回一个整数值,这个整数值有三种可能:
      • 小于 0 (str1 小于 str2)
      • 等于 0 (str1 等于 str2)
      • 大于 0 (str1 大于 str2)

比较规则(非常重要!)

strcmp 的比较是基于字符的 ASCII 码值 进行的,它会从字符串的开头开始,逐个字符进行比较:

  1. 找到第一个不匹配的字符:比较 str1str2 中对应位置上的字符。

    • 如果这两个字符的 ASCII 码值不同,函数就立即返回它们的差值(str1的字符ASCII码 - str2的字符ASCII码)。
    • 比较 "apple" 和 "banana":
      • 第一个字符 'a' (97) 和 'b' (98) 不同。
      • 函数返回 97 - 98 = -1
  2. 到达字符串结尾:如果所有对应字符都相同,但其中一个字符串先结束(即遇到了空字符 \0)。

    c语言中strcmp怎么用
    (图片来源网络,侵删)
    • 较短的字符串被认为“小于”较长的字符串。
    • 比较 "hello" 和 "hello world":
      • 前 5 个字符都相同。
      • "hello" 到达了结尾 \0,而 "hello world" 还有字符。
      • 函数返回 0 - 'w'(一个负数),表示 "hello" < "hello world"。
  3. 完全相同:如果两个字符串长度相同,并且所有对应字符都相同,直到都遇到 \0

    • 函数返回 0
    • 比较 "world" 和 "world":
      • 所有字符都相同,同时结束。
      • 函数返回 0

使用示例

下面是一个完整的 C 语言程序,展示了 strcmp 的几种典型用法。

#include <stdio.h>
#include <string.h> // 必须包含这个头文件才能使用 strcmp
int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    char str3[] = "apple";
    char str4[] = "APPLE"; // 注意大小写
    char str5[] = "apples";
    // 示例 1: str1 < str2
    int result1 = strcmp(str1, str2);
    printf("比较 \"%s\" 和 \"%s\":\n", str1, str2);
    if (result1 < 0) {
        printf("  结果: \"%s\" 小于 \"%s\" (返回值: %d)\n", str1, str2, result1);
    } else if (result1 > 0) {
        printf("  结果: \"%s\" 大于 \"%s\" (返回值: %d)\n", str1, str2, result1);
    } else {
        printf("  结果: \"%s\" 等于 \"%s\" (返回值: %d)\n", str1, str2, result1);
    }
    printf("\n");
    // 示例 2: str1 == str3
    int result2 = strcmp(str1, str3);
    printf("比较 \"%s\" 和 \"%s\":\n", str1, str3);
    if (result2 == 0) {
        printf("  结果: \"%s\" 等于 \"%s\" (返回值: %d)\n", str1, str3, result2);
    }
    printf("\n");
    // 示例 3: str1 > str4 (大小写敏感)
    int result3 = strcmp(str1, str4);
    printf("比较 \"%s\" 和 \"%s\":\n", str1, str4);
    if (result3 > 0) {
        printf("  结果: \"%s\" 大于 \"%s\" (返回值: %d)\n", str1, str4, result3);
        printf("  原因: 'a' (97) 的 ASCII 码大于 'A' (65)\n");
    }
    printf("\n");
    // 示例 4: str1 < str5 (长度不同)
    int result4 = strcmp(str1, str5);
    printf("比较 \"%s\" 和 \"%s\":\n", str1, str5);
    if (result4 < 0) {
        printf("  结果: \"%s\" 小于 \"%s\" (返回值: %d)\n", str1, str5, result4);
        printf("  原因: \"apple\" 是 \"apples\" 的前缀,所以更短\n");
    }
    return 0;
}

程序输出:

比较 "apple" 和 "banana":
  结果: "apple" 小于 "banana" (返回值: -1)
比较 "apple" 和 "apple":
  结果: "apple" 等于 "apple" (返回值: 0)
比较 "apple" 和 "APPLE":
  结果: "apple" 大于 "APPLE" (返回值: 32)
  原因: 'a' (97) 的 ASCII 码大于 'A' (65)
比较 "apple" 和 "apples":
  结果: "apple" 小于 "apples" (返回值: -115)
  原因: "apple" 是 "apples" 的前缀,所以更短

(注意:不同编译器或平台下,返回的差值可能不完全一样,但 <0, ==0, >0 的关系是确定的。)

c语言中strcmp怎么用
(图片来源网络,侵删)

常见错误和注意事项

错误用法:if (strcmp(str1, str2))

这是一个非常常见的错误,初学者可能会这样写:

// 错误示例!
if (strcmp(str1, str2)) {
    printf("字符串不相等\n");
}

为什么是错误的?

  • strcmp 返回 0(表示字符串相等)时,if (0) 的条件为 ,代码块不会执行。
  • strcmp 返回非零值(表示字符串不相等)时,if (非零值) 的条件为 ,代码块会执行。

这导致了逻辑上的完全相反:你本想在字符串相等时执行某些操作,但实际上却在它们不相等时执行了。

正确用法

你应该明确地检查返回值是否等于 0:

// 正确用法 1: 检查是否相等
if (strcmp(str1, str2) == 0) {
    printf("字符串相等\n");
}
// 正确用法 2: 检查是否不相等
if (strcmp(str1, str2) != 0) {
    printf("字符串不相等\n");
}
// 正确用法 3: 检查 str1 是否小于 str2
if (strcmp(str1, str2) < 0) {
    printf("str1 小于 str2\n");
}

strcmp 的不区分大小写版本

你可能希望比较 "Apple" 和 "apple" 时认为它们是相等的,C 标准库提供了另一个函数 strcasecmp(在 Linux/macOS 上)或 _stricmp(在 Windows 上)来实现不区分大小写的比较。

注意:这些函数不是标准 C 的一部分,在不同平台上的名称可能不同,使用时需要查阅特定平台的文档。

Linux/macOS 示例 (strcasecmp)

#include <stdio.h>
#include <strings.h> // 注意头文件是 strings.h
int main() {
    char str1[] = "Apple";
    char str2[] = "apple";
    int result = strcasecmp(str1, str2);
    if (result == 0) {
        printf("不区分大小写比较: \"%s\" 等于 \"%s\"\n", str1, str2);
    }
    return 0;
}
函数 头文件 功能 返回值
strcmp <string.h> 区分大小写的字符串比较 <0, ==0, >0
strcasecmp (Linux/macOS) <strings.h> 不区分大小写的字符串比较 <0, ==0, >0
_stricmp (Windows) <string.h> 不区分大小写的字符串比较 <0, ==0, >0

strcmp 的核心是按 ASCII 码逐字符比较,并且一定要检查返回值是否等于 0 来判断字符串是否相等。

-- 展开阅读全文 --
头像
dede如何设置长尾关键词?
« 上一篇 03-04
Linux C编程如何高效实现底层功能?
下一篇 » 03-04

相关文章

取消
微信二维码
支付宝二维码

目录[+]