memcmp 函数的使用及其模拟实现
目录
一、函数原型
二、功能说明
三、返回值含义
四、示例代码
五、注意事项
六、memcmp 函数模拟实现
一、函数原型
memcmp
函数用于比较两个内存块的内容。
int memcmp(const void *ptr1, const void *ptr2, size_t num);
二、功能说明
比较从 ptr1
和 ptr2
指针指向的位置开始,向后的 num
个字节。
三、返回值含义
返回值 | 说明 |
---|---|
< 0 | 第一个不匹配的字节在 ptr1 中的值小于 ptr2 中的值(按无符号字符比较) |
0 | 两个内存块的内容完全相等 |
> 0 | 第一个不匹配的字节在 ptr1 中的值大于 ptr2 中的值(按无符号字符比较) |
四、示例代码
#include <stdio.h>
#include <string.h>int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);return 0;
}
五、注意事项
-
比较是按字节进行的,不考虑数据类型
-
比较是基于无符号字符值进行的
-
当遇到第一个不匹配的字节时即停止比较
-
需要包含
<string.h>
头文件
此函数常用于比较字符串、数组或任何内存区域的内容,特别适用于需要比较二进制数据的场景。
六、memcmp 函数模拟实现
#include <stdio.h>
#include <string.h>// 模拟实现的 memcmp 函数
int my_memcmp(const void *ptr1, const void *ptr2, size_t num)
{if (num == 0)return 0;const unsigned char *p1 = (const unsigned char *)ptr1;const unsigned char *p2 = (const unsigned char *)ptr2;// 逐字节比较for (size_t i = 0; i < num; i++){if (p1[i] != p2[i]){// 返回第一个不匹配字节的差值return (int)(p1[i]) - (int)(p2[i]);}}return 0; // 所有字节都相等
}// 测试函数
void test_memcmp()
{printf("=== memcmp 函数测试 ===\n");// 测试用例1:完全相同的内存块char str1[] = "Hello World";char str2[] = "Hello World";int result1 = my_memcmp(str1, str2, strlen(str1));printf("测试1 - 相同字符串: %d (应为: %d)\n", result1, memcmp(str1, str2, strlen(str1)));// 测试用例2:不同的内存块char str3[] = "Hello World";char str4[] = "Hello World!";int result2 = my_memcmp(str3, str4, strlen(str3));printf("测试2 - 不同长度: %d (应为: %d)\n", result2, memcmp(str3, str4, strlen(str3)));// 测试用例3:部分比较char str5[] = "ABCDEF";char str6[] = "ABCXYZ";int result3 = my_memcmp(str5, str6, 3);printf("测试3 - 前3字节相同: %d (应为: %d)\n", result3, memcmp(str5, str6, 3));int result4 = my_memcmp(str5, str6, 4);printf("测试4 - 前4字节不同: %d (应为: %d)\n", result4, memcmp(str5, str6, 4));// 测试用例4:数字数组比较int arr1[] = {1, 2, 3, 4};int arr2[] = {1, 2, 5, 4};int result5 = my_memcmp(arr1, arr2, sizeof(arr1));printf("测试5 - 数字数组比较: %d (应为: %d)\n", result5, memcmp(arr1, arr2, sizeof(arr1)));// 测试用例6:零字节比较int result6 = my_memcmp(str1, str2, 0);printf("测试6 - 零字节比较: %d (应为: %d)\n", result6, memcmp(str1, str2, 0));
}int main()
{test_memcmp();return 0;
}