【C生万物】 字符串内存函数篇 (下)

news/2024/11/8 2:15:39/

 欢迎来到 Claffic 的博客 💞💞💞                               👉 专栏:《C生万物 | 先来学C》👈

前言:

承接上篇,在认识了常用的字符串和内存函数后,带大家实现几个函数。


目录

Part3:库函数模拟实现

1.模拟strlen

2.模拟strcpy

3.模拟strcat

4.模拟strstr

5.模拟strcmp

6.模拟memcpy

7.模拟memmove


Part3:库函数模拟实现

说这个模拟实现啊,一定要先找找文档,看看库函数是怎么定义的。

这里贴几个模拟实现库函数需要注意的地方:

• 注意参数顺序和类型;

• 保证函数的功能,明确停止的条件;

• 善用 assert ,有 bug 不难找;

• 注意返回值。

 

1.模拟strlen

我记得之前模拟实现 strlen 单独写成过一篇,我找找... ... 

噢,元赖氏真的写过一篇,就放在这里了 ヾ(•ω•`)o :

strlen 的三种模拟方法_strlen的模拟_Claffic的博客-CSDN博客https://blog.csdn.net/Claffic/article/details/128635709

2.模拟strcpy

这是个拷贝字符串的,遇到空就停止

参考代码:

char* my_strcpy(char* dest, const char* src) // 参数类型要正确
{char* ret = dest;// assert 判空assert(dest != NULL);assert(src != NULL);// 下面简直妙哉while ((*dest++ = *src++)){;}return ret;
}

这个空语句简直妙哉!!!

执行 while 的判断部分,遇到空就停止,恰好符合要求。 

3.模拟strcat

这货是用来追加字符串的

参考代码:

char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);// 先找dest的末尾while (*dest){dest++;}// 开始追加while ((*dest++ = *src++)){;}return ret;
}

4.模拟strstr

这个函数是用来切分字符串的

参考代码:

char* strstr(const char* str1, const char* str2)
{char* cp = (char*)str1;char* s1, * s2;if (!*str2)return (char*)str1;while (*cp){s1 = cp;s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2))s1++, s2++;if (!*s2)return cp;cp++;}return NULL;
}

这种实现利用了 KMP 算法。 

5.模拟strcmp

依次比较两个字符串中的字符,返回 int 类型

参考代码:

int my_strcmp(const char* src, const char* dst)
{int ret = 0;assert(src != NULL);assert(dst != NULL);// dst不为空,且src与dst相等就继续下一个,与此同时也标记了retwhile (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)++src, ++dst;if (ret < 0)ret = -1;else if (ret > 0)ret = 1;return ret;
}

6.模拟memcpy

内存拷贝函数,注意指定的 num

参考代码:

void* my_memcpy(void* dst, const void* src, size_t num)
{void* ret = dst;assert(dst);assert(src);while (num--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}return ret;
}

7.模拟memmove

这个相比 memcpy 就复杂很多了,因为要处理源空间与目标空间的多种关系

参考代码:

void* memmove(void* dst, const void* src, size_t num)
{void* ret = dst;// 源空间与目标空间不重叠,从低地址向高地址拷贝if (dst <= src || (char*)dst >= ((char*)src + num)) {while (num--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}// 源空间与目标空间重叠,从高地址向低地址拷贝else {dst = (char*)dst + num - 1;src = (char*)src + num - 1;while (num--) {*(char*)dst = *(char*)src;dst = (char*)dst - 1;src = (char*)src - 1;}}return ret;
}

源空间与目标空间重叠,从高地址向低地址拷贝的原因是保证源空间拷贝到目标空间不被破坏,才能确保拷贝成功。


总结: 

带大家手撸了几个与字符串和内存相关的函数,建议学会后自己尝试一下。

码文不易 

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗


http://www.ppmy.cn/news/82178.html

相关文章

【腾讯云Finops Crane集训营】降本增效之 Crane 初体验

1. Crane 初识2. Crane 如何进行成本优化&#xff1f;3. Crane 快速上手体验3.1 安装 Prometheus 和 Grafana3.2 安装 Crane 和 Fadvisor3.3 验证安装是否成功3.4 访问 Dashboard 4. Crane 初体验 - 总结&建议5. 关于腾讯云 Finops Crane 集训营 最近有幸参加了腾讯云 Fino…

基于广义Benders分解法的综合能源系统优化规划(matlab程序)

目录 1 主要内容 广义benders分解法流程图&#xff1a; 优化目标&#xff1a; 约束条件&#xff1a; 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《综合能源系统协同运行策略与规划研究》第四章内容基于广义Benders分解法的综合能源系统优化规划&…

【利刃出鞘】链式思维利用ChatGPT,让其成为工作中的利剑?附带初学者扫盲SpringBoot

【利刃出鞘】链式思维利用ChatGPT&#xff0c;让其成为工作中的利剑 一、一点思考二、技术学习——链式思维2.1 springboot注册bean的几种方式&#xff1f;2.2 springboot Component 注册的原理&#xff1f;2.3 springboot引用注册的Bean原理&#xff1f;2.4 private final MyB…

专为Windows电脑和服务器设计的磁盘管理软件

关于Windows磁盘管理 磁盘管理是Windows自带工具&#xff0c;允许你对磁盘进行一些基本操作&#xff0c;Windows个人用户和Windows Server用户可以使用它来&#xff1a; 1. 创建一个新驱动器&#xff0c;如“新建简单卷”功能。 2. 将一个卷扩展到当前未被同一磁盘…

通过Python的filestools库给图片添加全图水印

文章目录 前言一、filestools库简介二、安装filestools三、查看filestools版本四、图片添加全图水印1.引入库2.添加水印3.效果 五、参数调整对比1.水印颜色1.1通过名称设置颜色1.2通过RGB值设置颜色1.3通过十六进制设置颜色 2.水印字体的大小3.水印的透明度4.水印直接的间隔5.水…

如何对图片进行卷积计算

1 问题 如何对图片进行卷积计算&#xff1f; 2 方法 先导入torch和torch里的nn类&#xff0c;然后设置一个指定尺寸的随机像素值的图片&#xff0c;然后使用nn.conv2d函数进行卷积计算&#xff0c;然后建立全连接层&#xff0c;最后得到新的图片的尺寸 步骤: (1) 导入实验所需要…

快递业的最新发展趋势:2023年市场预测

快递业是随着电子商务崛起而迅速发展的行业之一。自从互联网取代了线下商业模式&#xff0c;电子商务的发展成为了现代零售业的主要趋势&#xff0c;而快递业则变得越来越重要和不可或缺。未来的快递业需要应对许多挑战和机遇。 在2023年&#xff0c;快递业将进一步走向数字化、…

End-to-End Object Detection with Transformers 论文学习

论文地址&#xff1a;End-to-End Object Detection with Transformers 1. 解决了什么问题&#xff1f; 现有的目标检测算法需要大量的人为先验的设计&#xff0c;如 anchor 和 NMS&#xff0c;整体架构并不是端到端的。现有的检测方法为了去除重叠框&#xff0c;一般会利用 p…