当前位置: 首页 > news >正文

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;
}

http://www.xdnf.cn/news/1343863.html

相关文章:

  • 数学建模--Topsis
  • 分布式与微服务
  • [特殊字符] 潜入深渊:探索 Linux 内核源码的奇幻之旅与生存指南
  • LeetCode Hot 100 第一天
  • 相机曝光调节与自动曝光控制详解
  • AI适老服务暖人心:AI适老机顶盒破数字鸿沟、毫米波雷达护独居安全,银发生活新保障
  • 初识数据结构——Map和Set:哈希表与二叉搜索树的魔法对决
  • 车载以太网SOME/IP协议:面向服务的汽车通信技术详解
  • python-对图片中的人体换背景色
  • Java面试宝典:Redis底层原理(持久化+分布式锁)
  • 机器学习-线性回归
  • [react] class Component and function Component
  • vsCode或Cursor 使用remote-ssh插件链接远程终端
  • 用户登录Token缓存Redis实践:提升SpringBoot应用性能
  • yggjs_rlayout使用教程 v0.1.0
  • unistd.h 常用函数速查表
  • 【Linux仓库】进程的“夺舍”与“飞升”:exec 驱动的应用现代化部署流水线
  • Elasticsearch倒排索引和排序
  • Elasticsearch核心概念
  • 【机器学习深度学习】大模型分布式推理概述:从显存困境到高并发挑战的解决方案
  • 用sftp协议实现对文件的上传下载
  • 高压、高功率时代,飞机电气系统如何保障安全?
  • PDF文档安全升级:三招实现文本转曲线(防篡改+高清输出)
  • 一分钟docker部署onlyoffice 在线预览word pdf excel...
  • 嵌入式第三十五天(网络编程)
  • week3-[二维数组]最大列
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析9
  • Windows应急响应一般思路(二)
  • 【基础算法】离散化
  • 驱动(二)uboot编译+内核编译+文件系统