strmemcpy和memmovecpy的区别

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
char * strcpy(char * dest, const char * src) // 实现src到dest的复制
  if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
      return NULL;
  char *strdest =
//保存目标字符串的首地址
  while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下
  return
void *memcpy(void *memTo, const void *memFrom, size_t size)
  if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
return NULL;
  char *tempFrom = (char *)memF
//保存memFrom首地址
  char *tempTo = (char *)memTo;
//保存memTo首地址
  while(size -- & 0)
//循环size次,复制memFrom的值到memTo中
  *tempTo++ = *tempFrom++ ;
  return memTo;
strcpy和memcpy主要有以下3方面的区别。1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2、复制的方法不同。strcpy不需要指定长度(不安全,有缓冲区溢出危险),它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
阅读(...) 评论()memcpy 和 strcpy 的区别
来源:博客园

 
strcpy:
所需头文件:#include&string.h&
 

extern char *strcpy(char *dest, const char *src,);
 

从源src地址开始且含有NULL(‘\0’)结束符的字符串复制到以dest开始的地址空间,函数返回指向dest的指针
strc和des所指内存区域不可以重叠且dest必须有足够的空间来存储src字符串
 
memcpy:
所需头文件:#include&string.h&
 

Void *memcpy(void *dest, const void *src, size_t n);
 

从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,函数返回指向dest的指针。
source和destin所指内存区域不能重叠,如果重叠,则函数的行为不确定
 
memcpy 和 strcpy 的区别:
 
&1& 复制的内容和可复制的范围不同。strcpy仅能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
&2& 复制的方法和方式不同。strcpy不需要指定的长度,遇到被复制字符的串结束符’\0’才结束,容易溢出;而memcpy则根据第三个参数size_t n决定复制的长度
&3& 用途不同。通常在复制字符串时用strcpy,而复制其他数据类型时一般用memcpy。
&4& 如果初始时destin本身已有数据,执行memcpy后,将从头开始覆盖原有数据,但至多仅能覆盖n个字节。
 

#include&stdio.h&
#include&string.h&

int main()
{
char *s = "Golden Global View";
char k[20], f[20];
char t[20], r[20]; 
printf("原始字符串:\n");
printf("%s\n\n", s);

/*-----------------------------------memcpy-------------------------------------*/ 
memcpy(k, s, strlen(s)*sizeof(char)+1);
// strlen(s) 后 +1 是要取得s字符串中的终止符'\0' 
printf("将s中的字符串复制到k数组中:\n");
printf("%s\n\n", k);


memcpy(f, s+7, 11*sizeof(char)+1);
printf("将s中第7个字符开始的11个连续字符复制到f数组中\n");
printf("%s\n\n", f);
printf("覆盖的情况,k和f数组的值可以可看上面\n");
printf("\n未+1处理覆盖的情况: ");
memcpy(k, f, strlen(f));
printf("%s\n", k);
printf("已+1处理覆盖的情况:
memcpy(k, f, strlen(f)+1);
printf("%s\n\n", k); 

/*----------------------------------strcpy-----------------------------------*/
printf("++++++++++++++++++++++++我是分割线++++++++++++++++++++++++++++++\n\n");
printf("相比之下的strcpy函数:\n\n");
strcpy(t, s);
printf("%s\n\n", t);
/*strcpy会把dest字符串的终止符也复制进去,这点可以联想到使用memset的情形,
一些人会滥用memset,包括我,所以我才这样说的,比如说在交换两个字符串的时
侯总觉得要在执行strcpy前要先memset一下才觉得放心,这最终会导致效率低下*/ 

}

 
Output:
原始字符串:Golden Global View
将s中的字符串复制到k数组中:Golden Global View
将s中第7个字符开始的11个连续字符复制到f数组中Global View
覆盖的情况,k和f数组的值可以可看上面
未+1处理覆盖的情况: Global Viewal View已+1处理覆盖的情况:
Global View
++++++++++++++++++++++++我是分割线++++++++++++++++++++++++++++++
相比之下的strcpy函数:
Golden Global View
 
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动strcpy和memcpy的区别_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
strcpy和memcpy的区别
我有更好的答案
const void *memFrom, size_t size){  if((memTo == NULL) || (memFrom == NULL)) //0&才结束,所以容易溢出。strcpy不需要指定长度。3:char* strcpy(char* dest, const char* src),并且它不仅复制字符串内容之外,还会复制字符串的结束符。已知strcpy函数的原型是。memcpy则是根据其第3个参数决定复制的长度;判断参数src和dest的有效性  {       return NULL; //循环size次,复制memFrom的值到memTo中
  *tempTo++ = *tempFrom++ ;   return memTo;}strcpy和memcpy主要有以下3方面的区别。1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组,它遇到被复制字符的串结束符&&#92、复制的方法不同; 实现src到dest的复制{  if ((src == NULL) || (dest == NULL)) /&#47。2;  char *tempFrom = (char *)memF
//}void *memcpy(void *memTo、整型、结构体、类等;保存memFrom首地址  char *tempTo = (char *)memTo;
&#47,因此用途更广。void *memcpy( void */保存memTo首地址
  while(size -- &gt、用途不同。通常在复制字符串时用/把src字符串的内容复制到dest下  
/&#47, const void *src, size_t count );char * strcpy(char * dest, const char * src) //);0'保存目标字符串的首地址  while ((*strDest++ = *strSrc++)!='\  }  char *strdest =memTo和memFrom必须有效
return NULL。即strcpy只用于字符串复制。strcpy提供了字符串的复制strcpy和memcpy的区别strcpy和memcpy都是标准C库函数,它们有下面的特点;memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制
采纳率:95%
来自团队:
trcpy是拷贝字符串,以&#92,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符)memcpy的原型为void *memcpy(void *0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)strcpy的原型为char *strcpy(char *dest, const void *src, size_t n), const char *src)而memcpy是给定来源和目标后
为您推荐:
其他类似问题
memcpy的相关知识
等待您来回答温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1840)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'sprintf、strcpy 及 memcpy 函数的区别',
blogAbstract:'sprintf 可以进行额外的格式化\r\nstrcpy 会复制直到出现 \'\' 为止,可能溢出\r\nstrncpy 会复制一个以 \'\' 结束的字符串,但是如果字符串长度超过指定数量则被截断,但结果可能不包含 \'\' 表示结束\r\nmemcpy 只负责复制指定数量的 bytes,不处理 \'\' 的情况\r\nmemmove 在 memcpy 的基础上对 overlap 的情况进行了处理。这些函数的区别在于 实现功能 以及 操作对象\r\n 不同。\r\n\r\nstrcpy 函数操作的对象是 字符串,完成 从 \r\n源字符串 到 目的字符串 的 拷贝 功能。',
blogTag:'',
blogUrl:'blog/static/7',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:7,
permalink:'blog/static/7',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 memcpy memmove 区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信