C语言字符串与内存操作函数模拟实现详解
一、strstr函数模拟实现1.1 函数功能strstr用于在字符串str1中查找子串str2的首次出现位置const char* strstr(const char* str1, const char* str2); char* strstr(char* str1, const char* str2);找到则返回第一次出现的起始地址找不到则返回NULL1.2 实现原理场景1简单匹配char arr[] abcdefabcdef; char* p cdef; char* ret my_strstr(arr, p); // 返回 cdefabcdef 的起始地址场景2多次匹配复杂情况str1: abbbcdef\0 str2: bbc\0可能存在多次匹配尝试需要逐字符比较1.3 模拟实现代码char* my_strstr(const char* str1, const char* str2) { assert(str1 str2); const char* cur str1; // 当前查找位置 const char* s1 NULL; const char* s2 NULL; while (*cur ! \0) { s1 cur; s2 str2; // 逐字符比较 while (*s1 ! \0 *s2 ! \0 *s1 *s2) { s1; s2; } // 如果str2完全匹配成功 if (*s2 \0) { return (char*)cur; // 返回找到的位置 } cur; // 继续下一个位置 } return NULL; // 未找到 }二、memcpy函数模拟实现2.1 函数功能void* memcpy(void* destination, const void* source, size_t num);将源内存区域的num个字节拷贝到目标内存区域返回目标空间的起始地址不负责处理重叠内存的拷贝2.2 实现原理int arr1[] {1,2,3,4,5,6,7,8,9,10}; int arr2[20] {0}; my_memcpy(arr2, arr12, 20); // 拷贝arr1中的3,4,5,6,7内存图示源地址(src): arr12 → 元素3的位置 目标地址(dest): arr2 → 起始位置 拷贝大小: 20字节 (5个int, 假设int为4字节)2.3 模拟实现代码void* my_memcpy(void* dest, const void* src, size_t num) { void* ret dest; assert(dest src); // 逐字节拷贝 for (size_t i 0; i num; i) { *(char*)dest *(char*)src; dest (char*)dest 1; src (char*)src 1; } return ret; }三、memmove函数模拟实现3.1 函数功能void* memmove(void* destination, const void* source, size_t num);与memcpy功能类似但能够处理内存重叠的情况C语言标准规定memcpy负责不重叠内存拷贝memmove负责重叠内存拷贝3.2 内存重叠问题int arr1[] {1,2,3,4,5,6,7,8,9,10}; my_memmove(arr1 2, arr1, 20); // 将前5个元素拷贝到从索引2开始的位置拷贝前索引: 0 1 2 3 4 5 6 7 8 9 值: 1 2 3 4 5 6 7 8 9 10错误拷贝方式从前向后arr1[2] arr1[0] → 1 arr1[3] arr1[1] → 2 arr1[4] arr1[2] → 1 (已经被覆盖!) arr1[5] arr1[3] → 2 (已经被覆盖!) ...3.3 模拟实现代码正确处理重叠void* my_memmove(void* dest, const void* src, size_t num) { void* ret dest; assert(dest src); // 情况1dest在src前面或内存不重叠 → 从前向后拷贝 if (dest src) { char* d (char*)dest; const char* s (const char*)src; while (num--) { *d *s; } } // 情况2dest在src后面有重叠风险 → 从后向前拷贝 else { char* d (char*)dest num - 1; // 指向目标末尾 const char* s (const char*)src num - 1; // 指向源末尾 while (num--) { *d-- *s--; } } return ret; }四、关键区别与总结4.1 strstr vs mem系列函数函数操作对象返回类型主要用途strstr字符串char*查找子串memcpy内存块void*非重叠内存拷贝memmove内存块void*任意内存拷贝含重叠4.2 memcpy vs memmove标准规定memcpy只需实现不重叠内存拷贝memmove必须处理重叠内存拷贝实际实现某些编译器如VS的memcpy也能处理重叠内存但为保证可移植性重叠时应使用memmove性能考虑不重叠时两者性能相近重叠时memmove会进行方向判断略有开销4.3 使用建议查找字符串子串 → 使用strstr拷贝不重叠的内存块 → 使用memcpy性能可能略优不确定内存是否重叠 → 使用memmove更安全需要自己实现时 → 参考上述代码注意处理所有边界情况五、完整测试示例#include stdio.h #include string.h #include assert.h // 测试代码 int main() { // 1. 测试my_strstr char str[] abcdefabcdef; char sub[] cdef; char* result my_strstr(str, sub); printf(strstr测试: %s\n, result ? result : 未找到); // 2. 测试my_memcpy int arr1[10] {1,2,3,4,5,6,7,8,9,10}; int arr2[20] {0}; my_memcpy(arr2, arr12, 20); printf(memcpy测试: ); for(int i 0; i 5; i) printf(%d , arr2[i]); printf(\n); // 3. 测试my_memmove重叠 int arr3[] {1,2,3,4,5,6,7,8,9,10}; my_memmove(arr32, arr3, 20); printf(memmove测试: ); for(int i 0; i 10; i) printf(%d , arr3[i]); printf(\n); return 0; }这些函数是C语言中处理字符串和内存的基础工具理解它们的实现原理对于深入理解C语言内存管理和字符串操作至关重要。

相关新闻

【LLM】CL-bench:评估LLM学新知识的能力

【LLM】CL-bench:评估LLM学新知识的能力

note CL-bench 围绕一个简单但严格的设计原则构建:每个任务都必须要求从 context 中学习新知识。 CL-bench 中的每个 context 都是完全自包含(Self-contained)的。解决任务所需的所有信息都显式地提供在 context 本身之中:不需要…

2026/7/3 15:01:52 阅读更多 →
电脑端串口助手一个时间戳后面跟几条完整报文,而不是每条报文添加一个时间戳,这是依据什么确定添加接收时间戳

电脑端串口助手一个时间戳后面跟几条完整报文,而不是每条报文添加一个时间戳,这是依据什么确定添加接收时间戳

电脑端串口助手采用“‌超时机制‌”确定时间戳的添加规则,核心依据是‌相邻报文接收的时间间隔‌。具体逻辑如下:⚙️ 时间戳分组机制 ‌时间阈值设定‌ 通过用户配置的 ‌"时间值"参数‌(如 100ms)作为分组阈值&#…

2026/7/3 7:05:42 阅读更多 →
使用 Depth Anything V2 进行单目深度估计

使用 Depth Anything V2 进行单目深度估计

原文:towardsdatascience.com/monocular-depth-estimation-with-depth-anything-v2-54b6775abc9f?sourcecollection_archive---------4-----------------------#2024-07-24 神经网络是如何从二维图像中学习估计深度的? https://medium.com/neural.avb?…

2026/7/3 15:01:57 阅读更多 →

最新新闻

临床试验中的AI伦理护栏:可追溯、可审计、可问责的LLM落地实践

临床试验中的AI伦理护栏:可追溯、可审计、可问责的LLM落地实践

1. 项目概述:当大语言模型走进临床试验现场,我们到底在守护什么? 去年冬天,我在一家三甲医院的GCP(药物临床试验质量管理规范)办公室做流程优化咨询时,亲眼见过一个真实场景:研究者用…

2026/7/3 19:32:59 阅读更多 →
光伏逆变器能效采集监测系统方案

光伏逆变器能效采集监测系统方案

《晶体硅光伏组件和逆变器能效限定值及能效等级》提到,逆变器同步纳入三级能效管控体系,按20kW、50kW、150kW、500kW以上功率区间,分别限定加权总效率、最大转换效率两项核心指标。老旧低效逆变器无法匹配新一代N型高效组件,同步纳…

2026/7/3 19:32:59 阅读更多 →
【Skywalking从入门到精通】第02篇:APM和可观测性到底是啥——写给所有被这两个词搞懵的开发者

【Skywalking从入门到精通】第02篇:APM和可观测性到底是啥——写给所有被这两个词搞懵的开发者

<!- title: “APM和可观测性到底是啥——写给所有被这两个词搞懵的开发者” series: “Apache SkyWalking实战全解析” episode: 002 publish_date: “2026-07-02” author: “技术博客作者” tags: [“APM”, “可观测性”, “Observability”, “分布式追踪”, “Metrics”…

2026/7/3 19:28:58 阅读更多 →
STM32与TI降压转换器的嵌入式电源系统设计

STM32与TI降压转换器的嵌入式电源系统设计

1. 项目背景与硬件选型解析在嵌入式电源系统设计中&#xff0c;DC-DC降压转换是一个基础但至关重要的环节。我们选用STM32F217ZG作为主控芯片搭配171010550电源管理IC的方案&#xff0c;主要基于以下工程考量&#xff1a;STM32F217ZG这颗Cortex-M3内核的MCU具备&#xff1a;120…

2026/7/3 19:26:57 阅读更多 →
DDrawCompat:Windows 10/11经典游戏兼容性修复终极指南

DDrawCompat:Windows 10/11经典游戏兼容性修复终极指南

DDrawCompat&#xff1a;Windows 10/11经典游戏兼容性修复终极指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDraw…

2026/7/3 19:24:57 阅读更多 →
4-20mA电流环技术与工业自动化应用解析

4-20mA电流环技术与工业自动化应用解析

1. 4-20mA电流环基础与行业应用场景工业自动化领域广泛采用4-20mA电流环作为标准信号传输方式&#xff0c;这种看似简单的技术背后蕴含着深厚的工程智慧。电流环之所以成为工业控制领域的"普通话"&#xff0c;主要基于三个核心优势&#xff1a;抗干扰能力、远距离传输…

2026/7/3 19:22:57 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述&#xff1a;为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473&#xff0c;一个关于TLS/SSL协议重协商机制的漏洞&#xff0c;现在提起来还有必要吗&#xff1f;很多运维和开发朋友可能会觉得&#xff0c;这都老掉牙了&#xff0c;现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述&#xff1a;为什么需要双通道远程管理防火墙&#xff1f;在任何一个稍具规模的企业网络里&#xff0c;防火墙都是那个默默守护在边界的关键角色。作为网络工程师&#xff0c;我们不可能每次都跑到机房&#xff0c;插上console线去配置它。远程管理能力&#xff0c;…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述&#xff1a;AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域&#xff0c;同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件&#xff0c;与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻