当前位置: 首页 > 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.dtcms.com/a/344209.html

相关文章:

  • io.github.lucksiege:pictureselector状态栏没沉浸问题
  • 十大麦克风品牌排行榜,顶级麦克风品牌排行榜,麦克风品牌排行榜
  • 同济北化工联手AM:800 ℃/20 s磁感应闪焊合金负极,金属电池枝晶终结者
  • 一洽客服系统:自定义渠道启用路由和样式设置
  • 【自用】Maven常用依赖
  • AI知识管理全面指南:助力企业高效协作与创新
  • 【STM32】CubeMX(十一):FreeRTOS任务挂起与解挂
  • 汽车行业AI视觉检测方案(四):管控发动机外观缺陷
  • 【网卡配置编辑器】快捷的编辑网卡配置,便于调试网络设备
  • DOLO 上涨:Berachain 生态爆发的前奏?
  • 怎么用pytorch训练一个模型,并跑起来
  • More Effective C++ 条款02:最好使用C++转型操作符
  • JMeter 安装教程:轻松开启性能测试之旅
  • 前后端分离项目(Web篇)
  • BlockingQueue 是什么?
  • MySQL连接原理深度解析:从算法到源码的全链路优化
  • 微信扫码登陆 —— 接收消息
  • 关于日本服务器的三种线路讲解
  • 【Day01】堆与字符串处理算法详解
  • SHA 系列算法教程
  • C++ STL 中算法与具体数据结构分离的原理
  • Apache HTTP Server:深入探索Web世界的磐石基石!!!
  • SSM从入门到实战:2.5 SQL映射文件与动态SQL
  • C#中的LOCK
  • 关于 WebDriver Manager (自动管理浏览器驱动)
  • 第二阶段Winform-4:MDI窗口,布局控件,分页
  • 3.4 缩略词抽取
  • 企业级 AI 智能体安全落地指南:从攻击面分析到纵深防御体系构建
  • FileCodeBox 文件快递柜 一键部署
  • 获取后台返回的错误码