C memcmp() 函数

C memcmp() 语法

memcmp() 是 C 语言 <string.h> 标准库的一个函数,用于比较 “两个内存区域” 中 “指定字节数量” 的内容。它执行的是二进制比较,即逐个字节比较内存中的值。

语法:

memcmp(s1, s2, n)

说明:

memcmp() 函数接收以下 3 个参数。

  • s1(const void*):指向第 1 个要比较的内存块的指针。这是一个 const void* 指针,表示它指向的数据不会被修改。
  • s2(const void*):指向第 2 个要比较的内存块的指针。这是一个 const void* 指针,表示它指向的数据不会被修改。
  • n(size_t):要比较的字节数。

memcmp(s1, s2, n) 会从 s1 和 s2 指向的内存位置开始,逐个字节地比较它们的内容,直到找到第一对不相等的字节,或者已经比较了 n 个字节。比较是按照字节的数值大小进行的(通常是无符号字符 unsigned char 的值)。

提示: memcmp 是 “memory compare” 的缩写。

C memcmp() 摘要

使用频率
修改字符串
官方文档 查看

C memcmp() 示例

接下来,我们通过几个简单的例子来讲解一下 C memcmp() 函数是如何使用的。

示例 1:memcmp() 比较两个相等的整数数组

#include <stdio.h>
#include <string.h>

int main(void)
{
    int arr1[] = {10, 20, 30, 40, 50};
    int arr2[] = {10, 20, 30, 40, 50};
    size_t size = sizeof(arr1);           // 比较整个数组的字节数

    int result = memcmp(arr1, arr2, size);
    if (result == 0) {
        printf("在前 %zu 个字节内,arr1 和 arr 2 相等。", size);
    } else if (result < 0) {
        printf("在前 %zu 个字节内,arr1 小于 arr 2。", size);
    } else {
        printf("在前 %zu 个字节内,arr1 大于 arr 2。", size);
    }

    return 0;
}

运行结果如下。

在前 20 个字节内,arr1 和 arr 2 相等。

分析:

在这个例子中,我们使用 memcmp() 比较两个整型数组的内容。由于数组 arr1 和 arr2 的所有字节都是相同的,因此 memcmp() 会返回 0。

示例 2:memcmp() 比较两个不同的浮点数数组

#include <stdio.h>
#include <string.h>

int main(void)
{
    float arr1[] = {1.1f, 2.2f, 3.3f};
    float arr2[] = {1.1f, 2.2f, 4.4f};
    size_t size = sizeof(arr1);

    int result = memcmp(arr1, arr2, size);
    if (result == 0) {
        printf("在前 %zu 个字节内,arr1 和 arr 2 相等。", size);
    } else if (result < 0) {
        printf("在前 %zu 个字节内,arr1 小于 arr 2。", size);
    } else {
        printf("在前 %zu 个字节内,arr1 大于 arr 2。", size);
    }

    return 0;
}

运行结果如下。

在前 12 个字节内,arr1 小于 arr 2

分析:

memcmp() 会按字节来比较内存,即使是浮点数也会逐个字节比较其二进制表示。在这个例子中,虽然前几个字节相同,但在表示 3.3f 和 4.4f 的字节处出现了不同,因此 memcmp() 返回非零值。

示例 3:memcmp() 比较两个字符串的一部分

#include <stdio.h>
#include <string.h>

int main(void)
{
    const char str1[] = "abcdefg";
    const char str2[] = "abcfg";
    size_t size = 4;    // 只比较前 4 个字节

    int result = memcmp(str1, str2, size);
    if (result == 0) {
        printf("在前 %zu 个字节内,str1 和 str2 是相等的。", size);
    } else if (result < 0) {
        printf("在前 %zu 个字节内,str1 小于 str2。", size);
    } else {
        printf("在前 %zu 个字节内,str1 大于 str2。", size);
    }
    
    return 0;
}

运行结果如下。

在前 4 个字节内,str1 小于 str2。

分析:

memcmp() 可以用来比较字符串的一部分,这里我们指定比较前 4 个字节。在前 3 个字节中,两个字符串的内容相同("abc")。但在第 4 个字节处,str1 是 'd',str2 是 'f',由于 'd' 的 ASCII 值小于 'f',因此 memcmp() 返回一个负数,表示 str1 小于 str2。

注意,memcmp() 不会因为遇到 '\0' 而停止比较,它会一直比较指定的 n 个字节。

memcmp() 与 strcmp() 的区别

在 C 语言中,memcmp() 和 strcmp() 都可以用于比较内存内容,但它们之间存在重要区别:

  • strcmp():专门用于比较 “以空字符 '\0' 结尾的字符串” 。它会从字符串开头逐个字符进行比较,直到遇到第一个不相等的字符,或到达任何一个字符串的终止符 '\0'。比较是基于字符的 ASCII 码(或具体字符集)进行的。
  • memcmp():用于比较 “任意字节块” 。它会比较指定的 n 个字节,而不关心是否遇到终止符 '\0'。

memcmp() 的应用场景

在实际开发中,memcmp() 函数主要用于以下场景:

  • 比较非字符串数据类型(如整数数组、浮点数数组、结构体)的内容是否完全相同。
  • 比较包含嵌入式 '\0' 字符的二进制数据。
  • 实现需要精确字节比较的底层操作。
  • 在处理文件内容或网络数据时,比较指定长度的字节块。

上一篇: memset()

下一篇: memchr()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号