strncmp函数如何比较字符串的前n个字符?

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

strncmp 是什么?

strncmp 是 C 标准库中的一个字符串函数,它的名字是 "string compare with length" 的缩写,意为“按长度比较字符串”。

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

它的主要功能是比较两个字符串的前 n 个字符,并根据比较结果返回一个整数值,这个函数在需要限制比较范围时非常有用,可以避免比较整个字符串,从而提高效率或防止意外的越界访问。

函数原型

strncmp 函数的原型在 <string.h> 头文件中定义如下:

int strncmp(const char *str1, const char *str2, size_t n);

参数说明

  • str1: 第一个要比较的字符串。
  • str2: 第二个要比较的字符串。
  • n: 要比较的最大字符数。size_t 是一个无符号整型。

返回值

strncmp 的返回值是一个整数,其含义与 strcmp 类似:

  • 返回值 0:表示 str1str2 的前 n 个字符完全相同。
  • 返回值大于 0:表示 str1 的第一个不匹配字符的 ASCII 码值大于 str2 的对应字符,或者,str1 的前 n 个字符都匹配,但 str1 的长度恰好为 n(即 str1str2 的一个前缀),也可能返回一个大于 0 的值(具体值取决于实现,但通常是 str1 中第 n 个字符的值)。
  • 返回值小于 0:表示 str1 的第一个不匹配字符的 ASCII 码值小于 str2 的对应字符,或者,str2 的前 n 个字符都匹配,但 str2 的长度恰好为 n(即 str2str1 的一个前缀),也可能返回一个小于 0 的值。

重要提示:不要将返回值简单地理解为 1-1,它返回的是第一个不匹配字符的差值,如果 str1 的字符是 'd' (ASCII 100),str2 的对应字符是 'a' (ASCII 97),则返回值可能是 100 - 97 = 3,在实际编程中,我们通常只关心返回值是零、正数还是负数。

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

工作原理

  1. 函数从 str1str2 的第一个字符开始,逐个进行比较。
  2. 它会比较最多 n 个字符。
  3. 比会在以下情况立即停止:
    • 找到第一个不匹配的字符。
    • 比较了 n 个字符。
    • 到达了 str1str2 的末尾(即遇到了 '\0' 字符)。

代码示例

下面通过几个例子来加深理解。

示例 1:基本比较

#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "apple";
    char str2[] = "apple";
    char str3[] = "apricot";
    char str4[] = "app";
    // 情况1: 前n个字符完全相同
    int result1 = strncmp(str1, str2, 5);
    printf("strncmp(\"apple\", \"apple\", 5) = %d\n", result1); // 输出: 0
    // 情况2: 在n个字符内出现不同
    int result2 = strncmp(str1, str3, 3);
    printf("strncmp(\"apple\", \"apricot\", 3) = %d\n", result2); // 输出: 0 (因为前3个字符 'a', 'p', 'p' 相同)
    int result3 = strncmp(str1, str3, 4);
    printf("strncmp(\"apple\", \"apricot\", 4) = %d\n", result3); // 输出: < 0 (因为 'l' < 'r')
    // 情况3: 一个字符串是另一个的前缀,且n等于较短字符串的长度
    int result4 = strncmp(str1, str4, 3);
    printf("strncmp(\"apple\", \"app\", 3) = %d\n", result4); // 输出: 0 (因为前3个字符 'a', 'p', 'p' 相同)
    // 情况4: n大于两个字符串的长度
    int result5 = strncmp(str1, str4, 10);
    printf("strncmp(\"apple\", \"app\", 10) = %d\n", result5); // 输出: > 0 (因为 'app' < 'apple',在比较到 'app' 后,str4结束,str1还有字符)
    return 0;
}

示例 2:实际应用(检查文件扩展名)

strncmp 在处理文件路径或检查特定前缀时非常常见。

#include <stdio.h>
#include <string.h>
int main() {
    char filename1[] = "document.txt";
    char filename2[] = "image.png";
    char filename3[] = "script.js";
    // 检查是否以 ".txt" 
    if (strncmp(filename1 + strlen(filename1) - 4, ".txt", 4) == 0) {
        printf("'%s' 是一个文本文件,\n", filename1);
    } else {
        printf("'%s' 不是一个文本文件,\n", filename1);
    }
    // 检查是否以 ".png" 
    if (strncmp(filename2 + strlen(filename2) - 4, ".png", 4) == 0) {
        printf("'%s' 是一个 PNG 图片,\n", filename2);
    } else {
        printf("'%s' 不是一个 PNG 图片,\n", filename2);
    }
    // 检查是否以 ".js" 
    if (strncmp(filename3 + strlen(filename3) - 3, ".js", 3) == 0) {
        printf("'%s' 是一个 JavaScript 文件,\n", filename3);
    } else {
        printf("'%s' 不是一个 JavaScript 文件,\n", filename3);
    }
    return 0;
}

解释filename1 + strlen(filename1) - 4 是一个指针运算,它指向字符串倒数第四个字符的位置,也就是 的位置,然后我们从这个位置开始,比较接下来的 4 个字符是否等于 ".txt"

strncmp vs. strcmp

特性 strncmp strcmp
功能 比较两个字符串的前 n 个字符 比较两个字符串的所有字符,直到遇到 '\0' 或发现不同
原型 int strncmp(const char *s1, const char *s2, size_t n); int strcmp(const char *s1, const char *s2);
参数 需要 3 个参数,包括 n 需要 2 个参数
用途 限制比较范围,提高效率,防止比较过长字符串 比较整个字符串是否相等
边界情况 n 为 0 时,直接返回 0 如果一个字符串是另一个的前缀,较短的字符串被认为“小于”较长的

strncmp 是一个强大且灵活的字符串比较函数,当你不需要比较整个字符串,或者只想比较字符串的某个部分时,它比 strcmp 更合适、更安全,理解它的三个参数和返回值规则是掌握它的关键。

-- 展开阅读全文 --
头像
dede模板建站公司哪家专业靠谱?
« 上一篇 今天
安装织梦为何必须改数据库?
下一篇 » 今天

相关文章

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

目录[+]