C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

前言


C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

本文主要讲解C语言的常用的一些函数的自我实现,经常出现在编程笔试题中,实现过程简单,对于学习C语言的同学来说也是很有帮助的。主要有以下三个函数:

  1. strcpy:char * strcpy(char * dest, const char * src);
  2. memcpy:void *memcpy(void *memTo, const void *memFrom, size_t size);
  3. memmove:void *memmove(void *dst,const void *src,size_t n);

函数介绍

可能大家都知道这三个函数都可以实现拷贝效果,在这里主要是讲下他们之间的区别,strcpy 和 memcpy主要有以下三方面的区别:      

  1. 复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。      
  2. 复制的方法不同。strcpy不需要指定长度,它遇到被复制字符串的结束符"\\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。      
  3. 用途不同。通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy

memcpy和memmove区别

当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 

C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

代码实现

char * strcpy(char * dest, constchar * src)

<code>char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{
\tif ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
\t{
\t\treturn NULL;
\t}
\tchar *strdest = dest; //保存目标字符串的首地址
\twhile ((*dest++ = *src++) != '\\0'); //把src字符串的内容复制到dest下
\treturn strdest;
}/<code>

测试结果:(不考虑secondStr长度大于firstStr的问题!)

C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

void *memcpy(void *memTo, const void *memFrom, size_t size)

<code>void *memcpy(void *memTo, const void *memFrom, size_t size)
{
\tif ((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
\t\treturn NULL;
\tchar *tempTo = (char *)memTo; //保存memTo首地址
\twhile (size-- > 0) //循环size次,复制memFrom的值到memTo中
\t\t*tempTo++ = *((char *)memFrom)++;
\treturn memTo;
}/<code>

测试结果:

C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

顺带一提,自定义类型的数据即可:

C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

void *memmove(void *dst,const void *src,size_t n)

<code>void *memmove(void *dst,const void *src,size_t n)
{
\tchar *dp = (char *)dst;
\tchar *sp = (char *)src;
\tif(dst==NULL || class="lazy" data-original==NULL)return NULL;
\t//非重叠
\t//dp < sp

\t//dp > (sp+n)
\tif(sp>dp||(sp+n)\t{
\t\twhile(n--)
\t\t\t*(dp++) = *(sp++);
\t}
\telse if(sp\t{//反向拷贝
\t\tsp += n;
\t\tdp += n;
\t\twhile(n--)
\t\t\t*(--dp) = *(--sp);
\t}
\treturn dst;
}
/<code>

测试结果:

C语言专题之三大拷贝库函数的实现,测试成功,源码奉上供你学习

尾言

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程

通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势


分享到:


相關文章: