【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现
目录
字符串拷贝函数(strcpy)
函数原型
应用实例
我们将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。
缺点
内存拷贝函数(memcpy)
函数原型
应用实例
我们依然将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。
这次我们试试整型数组能不能拷贝过去。
memcpy的模拟实现(my_memcpy)
实现样例
首先观察它形式
我们依葫芦画瓢,也写出类似的函数形式。
具体实现
字符串拷贝函数(strcpy)
函数原型
由图可知,strcpy的形参是(目的地址,来源地址),返回值为char *。
应用实例
我们将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{char arr[10] = "abcdefg";char brr[10] = { 0 };strcpy(brr, arr);printf("%s", brr);return 0;
}
缺点
如果不是字符类型,还能这样拷贝吗?
我们发现,编译器直接报错了,因为形参跟实参不兼容。 strcpy具有局限性,只能适用于字符类型的拷贝。我们想要任意类型的都能实现拷贝,那怎么办呢?我们可以使用内存拷贝函数,不管三七二十一,你在这个内存单元上,我就把你拷贝过去,这样便实现了任意类型的拷贝 。
内存拷贝函数(memcpy)
函数原型
由图可知,memcpy的返回类型是void*,它的形参是(目标地址,需要复制的地址,字节大小)
应用实例
我们依然将一个存放“abcdefg”的字符数组arr的内容拷贝到字符数组brr之中。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{char arr[10] = "abcdefg";int ret = strlen(arr);//求出字符串的长度char brr[10] = { 0 };memcpy(brr, arr,ret*sizeof(char));//字节数=个数*数据类型大小printf("%s", brr);return 0;
}
这次我们试试整型数组能不能拷贝过去。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int brr[10] = { 0 };memcpy(brr, arr, 10*4);//字节数=个数*数据类型大小for (int i = 0; i < 10; i++){printf("%d ", brr[i]);}return 0;
}
成功了,这说明memcpy的适用范围强于strcpy,那么memcpy是怎么实现的呢?
memcpy的模拟实现(my_memcpy)
实现样例
void* my_memcpy(void* dest, void* src, size_t count)
{void* ret=dest;while (count--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
首先观察它形式
我们依葫芦画瓢,也写出类似的函数形式。
void* my_memcpy(void* dest, void* src, size_t count)
具体实现
因为我们用的都是void*来接受参数,目的是保证兼容性(毕竟你不知道使用者使用的时候用的是什么数据类型),但计算机不知道void*指的是什么,所以需要强制类型转换。而强制类型转换,换成什么类型好呢?如果我们用int型,我们知道一个int元素占4个字节,那我们需要复制3个字节的东西咋办?所以,我们用只占一个字节的char型。
*(char*)dest = *(char*)src;
在拷贝完一个字节之后,指针向后移动一个字节
dest = (char*)dest + 1;
src = (char*)src + 1;
那么我们如何控制拷贝多少个字节呢?用while搭配count就行。
while (count--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}
函数运行完了,我们随便返回一个值就行。
return 0;
【C语言】字符串拷贝函数(strcpy)与内存拷贝函数的不同及内存拷贝函数(memcpy)的模拟实现相关推荐
- C语言编写字符串拷贝(strcpy)函数详解以及assert函数
目录 一.strcpy函数 原型声明 功能 说明 代码及运行结果 二.自己编写strcpy函数 代码一及运行结果 代码二(改进)及运行结果 代码三(进一步改进)及assert函数 在这里解释一下什么是 ...
- 关于c语言字符串函数和一些内存函数的的简介
关于c语言字符串函数和一些内存函数的的简介 求字符串长度的函数 strlen函数介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/20190301142458376 ...
- C语言—字符串函数和内存函数
文章目录 1.前言 2.字符串函数 2.1 长度不受限制的字符串函数 2.1.1 strlen 内部细节 使用方法 模拟实现 2.1.2 strcmp 内部细节 使用方法 模拟实现 2.1.3 str ...
- C语言——字符串+内存函数及其模拟实现
目录 0. 思维导图 1. 前言 2. 函数介绍 2.1 strlen 2.2 strcpy 2.3 strcat 2.4 strcmp 2.5 strncpy 2.6 strncat 2.7 str ...
- C语言字符串函数,内存函数讲解及其模拟
在这篇博客会讲解以下函数:strlen,strcpy,strcat,strcmp,strncpy,strncat,strncmp,strstr,strtok,memcpy,memmove,memset ...
- c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用
详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...
- C语言字符串库函数详解模拟实现(strlen、strcpy、strcat、strcmp)+字符操作函数+字符转换函数
字符串库函数详解 一.无字符串长度限制的字符串函数 1. strlen 计算字符串长度函数 2. strcpy 字符串拷贝函数 3. strcat 字符串追加函数 4. strcmp 字符串比较函数 ...
- c语言字符串之拷贝函数
1.strcpy函数 2.strncpy函数 **代码演示: ** strcpy函数: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...
- C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
C语言字符串操作函数 1. 字符串反转 - strRev 2. 字符串复制 - strcpy 3. 字符串转化为整数 - atoi 4. 字符串求长 - strlen 5. 字符串连接 - strca ...
- C语言字符串函数----strcpy函数
字符串函数<string.h> strcpy函数 strcpy()把第二个字符串拷贝到第一个字符串,相当于字符串赋值运算符 函数原型 char strcpy(char dest, cons ...
最新文章
- 开始整SWF文字高亮显示——第一步:解析PDFToFlex源文件(修改补充版)
- OpenStack社区正式接受UnitedStack有云Steth项目
- 多选月份的日期选择器_GitHub - ylmyg/SelectionTime: Android下日期选择器,支持范围选择、多选、单选、根据输入天数选择日期...
- C# 延时小函数 很好用
- iOS 自定义UIButton
- 分布式系统「伸缩性」大招之——「弹性架构」详解
- mysql命令行进入报错ERROR 2002 (HY000)
- 三茗硬盘保护系统安装Linux,重装windows系统而不影响linux引导的方法
- 二进制和格雷码之间的转换
- Windows中的iTunes Setup Assistant驱动程序错误修复
- COCO2017 test-dev评估
- snipaste滚动截图方法_不同级别的截图工具,快来按需领取吧
- 解决同一办公环境局域网下无法添加打印机的情况
- 虚拟机 服务器死机,VMware虚拟机开机卡死黑屏,进不了系统解决办法
- C# 编写的 64位操作系统 -MOOS
- redis常用命令 (查询出所有的商品,并返回json给客户端)redis之路(八)
- 线程池的七个核心参数
- 首页布局跟小程序如何配置Iconfont—小程序入门与实战(七)
- 【UE4】通过动画序列自动生成蒙太奇(In Code)
- HTML+CSS练习案例