<string.h>中部分库函数的模拟实现

在这里插入图片描述

前言

嗨,我是firdawn,本章将简单介绍,<string.h>中部分库函数的模拟实现,如strncpy,strncat,memcpy,memmove。在本文片末,还讲简单介绍判断机器大小端的函数实现,下面是本章的思维导图,那么,让我们开始吧!
在这里插入图片描述

一,模拟实现strncpy

1.1 strncpy的介绍

srtncpy的介绍参考cplusplus:strncpy,如下图是该介绍的机器翻译,有些地方可能翻译不准。从图中我们可以知道,strncpy用于将一个字符串拷贝到另一个字符数组中。
1.strncpy被包含在<string.h>这个头文件中。
2.它的函数声明为:char * strncpy ( char * destination, const char * source, size_t num );
3.其中包含三个参数,destination表示被拷贝的字符要放的目的地,source表示要拷贝到字符串的起始地址,num表示要拷贝几个字符。
4.返回值,返回值的类型为 char*,返回的是destination的值。
在这里插入图片描述

1.2 strncpy的使用

具体使用如图1.2-a
在这里插入图片描述
这里src数组被放入了4个字符。

1.3 实现strncpy

#include <string.h>#include <assert.h>char* my_strncpy(char* dest, const char* src, size_t num){assert(dest && src);char* p1 = dest;const char* p2 = src;//拷贝num个字符int i = 0;for (i = 0; i < num; i++){*p1++ = *p2++;}*p1 = '\0';return dest;}//模拟实现strncpyint main(){char arr1[20] = "a cute cat";char arr2[20] = { 0 };my_strncpy(arr2, arr1, 6);return 0;}

二,模拟实现strncat

2.1 strncat的介绍

srtncat的介绍参考cplusplus:strncat,同样的,因为该网站是国外的一个网站,所以有些地方可能翻译不准。如下图,是该介绍的机器翻译,从图中我们可以知道,strncat用于将一个字符串拼接到另一个字符数组的末尾。
在这里插入图片描述
1.使用函数所需的头文件:strncat 被包含在<string.h>这个头文件中。
2.函数声明:char * strncat ( char * destination, const char * source, size_t num );
3.参数:destination表示被拼接的字符要放的目的数组,source表示要被拼接到字符串的起始地址,num表示要拼接几个字符。
4.返回值:返回值的类型为 char*,返回的是destination的值。

2.2 strncat的使用

在这里插入图片描述
如上图,dest数组中被拼接了5个字符。

2.3 实现strncat

#include <string.h>#include <assert.h>char* my_strncat(char* dest, const char* src, size_t num){assert(dest && src);char* p1 = dest;const char* p2 = src;//让p1指向dest数组的'\0'位置while (*p1){p1++;}//拷贝num个字符int i = 0;for (i = 0; i < num; i++){*p1++ = *p2++;}*p1 = '\0';return dest;}//模拟实现strncatint main(){char arr1[20] = "a cute cat";char arr2[20] = "I have ";my_strncat(arr2, arr1, 6);return 0;}

三,模拟实现memcpy

3.1 memcpy的介绍

memcpy的介绍参考cplusplus:memcpy,如下图,是该介绍的机器翻译,从图中我们可以知道,memcpy用于拷贝内存块的数据,拷贝大小单位是字节,不过,对于重叠内存块的拷贝,标准是未定义的。
在这里插入图片描述

1.使用函数所需的头文件:memcpy 被包含在<string.h>这个头文件中。
2.函数声明:void * memcpy ( void * destination, const void * source, size_t num );
3.参数:destination表示被拷贝的数据要放的目的数组,source表示要被拷贝的数据的起始地址,num表示要拷贝几个字节。
4.返回值:返回值的类型为 void*,返回的是destination的值。

3.2 memcpy的使用

在这里插入图片描述
如图,我们第一次将src数组中的数据拷贝到了dest数组中,第二次将src1数组中的数据拷贝到了dest1中。

3.3 实现memcpy

#include <assert.h>void* memcpy(void* dest, const void* src, size_t num){assert(dest && src);char* p1 = (char*)dest;char* p2 = (char*)src;int i = 0;for (i = 0; i < num; i++){*p1++ = *p2++;}return dest;}//模拟实现memcpyint main(){char arr1[20] = "beautiful girl";char arr2[20] = { 0 };memcpy(arr2, arr1, sizeof(arr1));return 0;}

四,模拟实现memmove

4.1 memmove的介绍

memmove的介绍参考cplusplus:memmove,如下图,是该介绍的机器翻译,从图中我们可以知道,memmove用于拷贝内存块的数据,拷贝大小单位是字节,不过,它支持重叠内存块的拷贝,这在标准中是明确规定了的。
在这里插入图片描述

4.2 memmove的使用

在这里插入图片描述
在上图中,我们将src[ 2 ]的数据拷贝到了src后面,这里拷贝到内存块重叠了

4.3 实现memmove

#include <string.h>#include <assert.h>void* my_memmove(void* dest, const void* src, size_t num){assert(dest && src);const char* cur = (char*)src;char* p1 = NULL;if (dest > src){p1 = (char*)dest + num - 1;for (cur = (char*)src + num - 1; cur >= (char*)src; cur--){*p1-- = *cur;}}else{p1 = (char*)dest;for (cur = (char*)src; cur <= (char*)src + num - 1; cur++){*p1++ = *cur;}}return dest;}//模拟实现memmoveint main(){char arr1[30] = "a beautiful girl";my_memmove(arr1 + 2, arr1, sizeof(arr1));return 0;}

五,机器大小端的判断

5.1 简单介绍大小端

大小端(Endian)是计算机数据存储的一种方式。在计算机中,数据存储的最小单位是字节(byte),每个字节由8个二进制位组成。在一个多字节数据(如整数、浮点数等)在内存中存储时,需要决定字节的排列顺序。

大端存储(Big Endian):字节的高位保存在低地址,字节的低位保存在高地址。即最高有效字节(Most Significant Byte)存储在最低内存地址,最低有效字节(Least Significant Byte)存储在最高内存地址。

小端存储(Little Endian):字节的高位保存在高地址,字节的低位保存在低地址。即最低有效字节(Least Significant Byte)存储在最低内存地址,最高有效字节(Most Significant Byte)存储在最高内存地址。

不同的计算机架构和处理器可能采用不同的存储方式。例如,x86架构的计算机通常使用小端存储,而PowerPC架构的计算机通常使用大端存储。为了在不同架构的计算机之间进行数据交换,通常需要进行字节序转换操作。

5.2 大小端的函数实现

int CheckSystem(){int num = 1;return *((char*)&num);}//编写判断大小端程序int main(){int ret = CheckSystem();//小段返回1,大段返回0return 0;}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode SAP Systems配置HTTPS访问SAP

第一次访问提示&#xff0c;Self-Signed 证书 解决办法&#xff1a;https访问SAP Fiori网站&#xff0c;导出SSL证书为DER格式保存到硬盘上 双击DER文件&#xff0c;导入到系统 退出VSCode&#xff0c;再次启动 Test Connection, 提示 The system URL is using a hostname …

服务器攻防-中间件安全,weblogic(没怎么搞懂)

1.weblogic-工具 jboss 1.弱口令 直接输入admin就就去了 2.反序列化&#xff08;不是很懂java) jenkins glassfish 读密码文件 读取 就可以知道它的密码 我们就可以写脚本

使用DataGrip连接跳板机后再连接远程服务器的mysql数据库

相比配置本地数据库就是多了一步SSH/SSL配置。 添加新的mysql连接&#xff0c;选择SSH/SSL&#xff0c;勾选Use SSH tunnel&#xff1a; 点击右边的…配置跳板机连接&#xff0c;输入账号密码&#xff0c;然后保存&#xff1a; 接着配置General&#xff0c;里面填上要连接的数…

一款数字化管理平台源码:云MES系统(附架构图、流程)技术架构:springboot + vue-element-plus-admin

制造生产企业打造数字化生产管控的系统&#xff0c;从原材料、生产报工、生产过程、质检、设备、仓库等整个业务流程的管理和控制&#xff0c;合理安排生产计划、实时监控生产、优化生产工艺、降低不良产出和运营成本&#xff1b; 技术架构&#xff1a;springboot vue-elemen…

DHT11获取数据传输到PC端

1.DHT11的时序数据 a : dht 1 b &#xff1a;dht 0延时30ms c&#xff1a; dht 1 卡d点&#xff1b;while(dht1); 卡e点 while(!dht) 卡f点&#xff1a;while(dht) 卡g点&#xff1a;while(!dht) 有效数据都是高电平&#xff0c;持续时间不一样&#xff0c;50us读&#…

Go语言实现人脸检测(Go的OpenCV绑定库)

文章目录 OpenCVGithub官网安装环境变量 Go的OpenCV绑定库Github文档安装搜索视频设备ID显示视频检测人脸 OpenCV Github https://github.com/opencv/opencv/ 官网 https://opencv.org/ 安装 brew install opencv brew upgrade opencv安装目录 cd /usr/local/opt/opencv…

子比主题ACG美化插件[全开源]

WordPress插件是一种可以扩展和增强WordPress网站功能的应用程序。子比主题ACG美化插件听起来像是一个专门为ACG&#xff08;动画、漫画、游戏&#xff09;爱好者设计的美化插件&#xff0c;它可能包含多种功能来改善网站的外观和用户体验。 内置功能开关100意味着这个插件提供…

基于CNN卷积神经网络的金融数据预测matlab仿真,对比BP,RBF,LSTM

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 反向传播网络&#xff08;BP&#xff0c;多层感知器MLP&#xff09; 4.2 径向基函数网络&#xff08;RBF&#xff09; 4.3 卷积神经网络&#xff08;CNN&#xff09; 4.4 长短期记忆网…

计算机网络套接字知识(非常详细)从零基础入门到精通

本节重点 认识IP地址, 端口号, 网络字节序等网络编程中的基本概念; 学习socket api的基本用法; 一、预备知识 1.理解源IP地址和目的IP地址 ⭐在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 思考: 我们光有IP地址就可以完成通信了…

【30天精通Prometheus:一站式监控实战指南】第7天:postgres_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

Java基础之异常(简单易懂)

异常 1.JAVA异常体系 &#xff08;1&#xff09;Throwable类(表示可抛)是所有异常和错误的超类&#xff0c;两个直接子类为Error和Exception,分别表示错误和异常;其中异常类Exception又分为运行时异常和非运行时异常&#xff0c;这两个异常有很大区别&#xff0c;运行时异常也…

鲁教版六年级数学下册-笔记

文章目录 第五章 基本平面图形1 线段、射线、直线2 比较线段的长短3 角4 角的比较5 多边形和圆的初步认识第六章 整式的乘除1 同底数幂的乘法2 幂的乘方与积的乘方3 同底数幂的除法4 零指数幂与负整数指数幂5 整式的乘法6 平方差公式7 完全平方公式8 整式的除法 第七章 相交线与…

全域运营是割韭菜吗?常见套路有哪些?

随着全域运营赛道的全面开启&#xff0c;全域运营服务商和全域运营系统的数量迅速增加&#xff0c;持续激发赛道活力的同时&#xff0c;也让一些试图用全域运营割韭菜的人有了可趁之机。 值得庆幸的是&#xff0c;由于当前全域运营赛道刚兴起不久&#xff0c;因此&#xff0c;割…

Python | Leetcode Python题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; class Solution:def isBalanced(self, root: TreeNode) -> bool:def height(root: TreeNode) -> int:if not root:return 0leftHeight height(root.left)rightHeight height(root.right)if leftHeight -1 or rightHeight -1 or a…

C++青少年简明教程:If选择语句

C青少年简明教程&#xff1a;If选择语句 C中选择语句的语法是&#xff1a; if (条件) { 条件成立时需要执行的语句... } [else { 条件不成立时需要执行的语句... }] 说明&#xff1a; if后面使用一个括号&#xff0c;括号里是条件——关系表达式。 所谓的关系表达式就是判…

5.24学习记录

[FSCTF 2023]ez_php2 比较简单的pop链 <?php highlight_file(__file__); Class Rd{public $ending;public $cl;public $poc;public function __destruct(){echo "All matters have concluded";die($this->ending);}public function __call($name, $arg){for…

E1载波:一种2.048Mbps速率的PCM载波

E1载波的基本帧由32个子信道组成 帧长为256个bit,分为32个相等时隙&#xff0c;一个时隙为8个bit。256/328 时隙的编号为CH0~CH31 全帧包含256位,且每一帧用 125us时间传送 E1载波支持的数据传输效率为2.048Mbps&#xff0c;用PCM编码&#xff08;即 256bit/125us2.048Mbps…

微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设…

1.OLED

1.基础知识

网络拓扑—DHCP服务配置

文章目录 DHCP服务搭建相关配置细节前提安装DHCP服务 DHCP服务搭建 相关配置细节前提 系统&#xff1a;Windows Server 2003 IP网段&#xff1a;10.0.0.0/24 三台机子&#xff1a; 普通PC机 DHCP服务器 路由器&#xff08;两块网卡&#xff0c;连接内外网&#xff09; //注…