strcomp函数如何比较字符串?

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

strcmp 函数

strcmp (string compare) 函数用于字典序(Lexicographical order)比较两个字符串。

c语言 strcomp
(图片来源网络,侵删)

函数原型

#include <string.h>
int strcmp(const char *str1, const char *str2);

参数

  • str1: 第一个要比较的字符串。
  • str2: 第二个要比较的字符串。

返回值

strcmp 的返回值是一个整数,其含义如下:

  • 返回值 < 0: 表示 str1 小于 str2

    • 这意味着在字典中,str1 出现在 str2 的前面。
    • strcmp("apple", "banana") 会返回一个负数。
  • 返回值 = 0: 表示 str1 等于 str2

    • 这意味着两个字符串的每一个字符都完全相同。
    • strcmp("hello", "hello") 会返回 0
  • 返回值 > 0: 表示 str1 大于 str2

    c语言 strcomp
    (图片来源网络,侵删)
    • 这意味着在字典中,str1 出现在 str2 的后面。
    • strcmp("banana", "apple") 会返回一个正数。

工作原理

strcmp 会从左到右逐个字符比较 str1str2 的 ASCII 码值,直到遇到以下情况之一:

  1. 发现两个字符不相等,立即返回这两个字符的 ASCII 码值之差。
  2. 到达其中一个字符串的末尾(遇到 \0 字符)。
  3. 两个字符串同时到达末尾(即完全相等)。

代码示例

下面是一个完整的示例,展示了 strcmp 的不同用法和返回值。

#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    char str3[] = "apple";
    char str4[] = "Apple"; // 'A' (65) 的 ASCII 码小于 'a' (97)
    char str5[] = "apples";
    // 情况1: str1 < str2
    int result1 = strcmp(str1, str2);
    printf("strcmp(\"%s\", \"%s\") = %d\n", str1, str2, result1); // 输出: -1 (或一个负数)
    // 情况2: str1 == str3
    int result2 = strcmp(str1, str3);
    printf("strcmp(\"%s\", \"%s\") = %d\n", str1, str3, result2); // 输出: 0
    // 情况3: str2 > str1
    int result3 = strcmp(str2, str1);
    printf("strcmp(\"%s\", \"%s\") = %d\n", str2, str1, result3); // 输出: 1 (或一个正数)
    // 情况4: 大小写敏感比较 ('A' < 'a')
    int result4 = strcmp(str4, str1);
    printf("strcmp(\"%s\", \"%s\") = %d\n", str4, str1, result4); // 输出: 一个负数 (65 - 97 = -32)
    // 情况5: 一个字符串是另一个的前缀 ("apple" < "apples")
    int result5 = strcmp(str1, str5);
    printf("strcmp(\"%s\", \"%s\") = %d\n", str1, str5, result5); // 输出: 一个负数
    return 0;
}

注意strcmp 返回的具体负数或正数值取决于第一个不相等字符的 ASCII 码差,在大多数现代实现中,它通常只返回 -101,但 C 语言标准只规定其符号(小于、等于、大于),不规定具体数值,在编程中,我们通常只关心返回值的符号,而不是具体数值。


strncmp 函数

strcmp 会比较到字符串的末尾,如果你只想比较字符串的前 n 个字符,可以使用 strncmp 函数。

c语言 strcomp
(图片来源网络,侵删)

函数原型

#include <string.h>
int strncmp(const char *str1, const char *str2, size_t n);

参数

  • str1, str2: 要比较的两个字符串。
  • n: 要比较的最大字符数。

返回值

返回值规则与 strcmp 完全相同:负数、零或正数。

代码示例

#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "applepie";
    char str2[] = "appletree";
    // 比较 5 个字符
    int result = strncmp(str1, str2, 5);
    printf("strncmp(\"%s\", \"%s\", 5) = %d\n", str1, str2, result); // 输出: 0,因为前5个字符 "apple" 相同
    // 比较 6 个字符
    result = strncmp(str1, str2, 6);
    printf("strncmp(\"%s\", \"%s\", 6) = %d\n", str1, str2, result); // 输出: 一个负数,因为第6个字符 'p' < 't'
    return 0;
}

常见错误与注意事项

错误:比较字符串内容时使用

这是 C 语言初学者最常见的错误之一。

错误示例:

char str1[] = "hello";
char str2[] = "hello";
if (str1 == str2) { // 错误!
    printf("Strings are equal.\n");
}

原因:在 C 语言中,str1str2 是数组名,在表达式中会“退化”为指向数组首元素的指针(即内存地址)。str1 == str2 实际上是比较两个字符串的内存地址是否相同,而不是比较它们的内容是否相同,由于 str1str2 是两个不同的数组,它们在内存中的地址也必然不同,所以这个判断永远不会为真。

正确做法:

if (strcmp(str1, str2) == 0) {
    printf("Strings are equal.\n");
}

注意事项:大小写敏感

strcmp大小写敏感的,这意味着 "Hello" 和 "hello" 会被判定为不相等。

如果你需要进行不区分大小写的比较,可以使用 C 标准库中的 strcasecmp 函数(在 POSIX 系统如 Linux/macOS 上可用)或 _stricmp(在 Windows 系统上可用)。

// Linux/macOS
#include <strings.h>
strcasecmp("Hello", "hello"); // 返回 0
// Windows
#include <string.h>
_stricmp("Hello", "hello"); // 返回 0
函数 功能 返回值
strcmp 比较两个字符串的全部内容 < 0 (str1 < str2), 0 (str1 == str2), > 0 (str1 > str2)
strncmp 比较两个字符串的前 n 个字符 strcmp
strcasecmp / _stricmp 不区分大小写地比较两个字符串 strcmp

strcmp 是比较字符串内容的正确工具,永远不要用 来比较字符串。

-- 展开阅读全文 --
头像
模型如何调用?
« 上一篇 04-18
SQLite C语言如何高效操作数据库?
下一篇 » 04-18

相关文章

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

目录[+]