目录

字符串拷贝函数(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)的模拟实现相关推荐

  1. C语言编写字符串拷贝(strcpy)函数详解以及assert函数

    目录 一.strcpy函数 原型声明 功能 说明 代码及运行结果 二.自己编写strcpy函数 代码一及运行结果 代码二(改进)及运行结果 代码三(进一步改进)及assert函数 在这里解释一下什么是 ...

  2. 关于c语言字符串函数和一些内存函数的的简介

    关于c语言字符串函数和一些内存函数的的简介 求字符串长度的函数 strlen函数介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/20190301142458376 ...

  3. C语言—字符串函数和内存函数

    文章目录 1.前言 2.字符串函数 2.1 长度不受限制的字符串函数 2.1.1 strlen 内部细节 使用方法 模拟实现 2.1.2 strcmp 内部细节 使用方法 模拟实现 2.1.3 str ...

  4. 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 ...

  5. C语言字符串函数,内存函数讲解及其模拟

    在这篇博客会讲解以下函数:strlen,strcpy,strcat,strcmp,strncpy,strncat,strncmp,strstr,strtok,memcpy,memmove,memset ...

  6. c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...

  7. C语言字符串库函数详解模拟实现(strlen、strcpy、strcat、strcmp)+字符操作函数+字符转换函数

    字符串库函数详解 一.无字符串长度限制的字符串函数 1. strlen 计算字符串长度函数 2. strcpy 字符串拷贝函数 3. strcat 字符串追加函数 4. strcmp 字符串比较函数 ...

  8. c语言字符串之拷贝函数

    1.strcpy函数 2.strncpy函数 **代码演示: ** strcpy函数: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...

  9. C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    C语言字符串操作函数 1. 字符串反转 - strRev 2. 字符串复制 - strcpy 3. 字符串转化为整数 - atoi 4. 字符串求长 - strlen 5. 字符串连接 - strca ...

  10. C语言字符串函数----strcpy函数

    字符串函数<string.h> strcpy函数 strcpy()把第二个字符串拷贝到第一个字符串,相当于字符串赋值运算符 函数原型 char strcpy(char dest, cons ...

最新文章

  1. 开始整SWF文字高亮显示——第一步:解析PDFToFlex源文件(修改补充版)
  2. OpenStack社区正式接受UnitedStack有云Steth项目
  3. 多选月份的日期选择器_GitHub - ylmyg/SelectionTime: Android下日期选择器,支持范围选择、多选、单选、根据输入天数选择日期...
  4. C# 延时小函数 很好用
  5. iOS 自定义UIButton
  6. 分布式系统「伸缩性」大招之——「弹性架构」详解
  7. mysql命令行进入报错ERROR 2002 (HY000)
  8. 三茗硬盘保护系统安装Linux,重装windows系统而不影响linux引导的方法
  9. 二进制和格雷码之间的转换
  10. Windows中的iTunes Setup Assistant驱动程序错误修复
  11. COCO2017 test-dev评估
  12. snipaste滚动截图方法_不同级别的截图工具,快来按需领取吧
  13. 解决同一办公环境局域网下无法添加打印机的情况
  14. 虚拟机 服务器死机,VMware虚拟机开机卡死黑屏,进不了系统解决办法
  15. C# 编写的 64位操作系统 -MOOS
  16. redis常用命令 (查询出所有的商品,并返回json给客户端)redis之路(八)
  17. 线程池的七个核心参数
  18. 首页布局跟小程序如何配置Iconfont—小程序入门与实战(七)
  19. 【UE4】通过动画序列自动生成蒙太奇(In Code)
  20. HTML+CSS练习案例

热门文章

  1. 谁来保护商务人士的数据安全?
  2. linux修改时区EDT改为CST
  3. IDEA 启动找不到或无法加载主类两种解决办法
  4. 100个python算法超详细讲解:谁是窃贼
  5. JAVA 使用 com.aspose.words将word转换PDF等
  6. 什么是Webquest?
  7. [分享] linux利用nat123发布网站及注意事项
  8. 文件上传接受的类型:file的accept属性
  9. Ubuntu命令行scp学习
  10. 油猴脚本推荐:讨厌广告的进,去除百度、360、搜狗、必应的广告和重复内容!广告害人,且用且珍惜