strcpy和memcpy都是标准C库函数,它们有下面的特点。

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);

memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );

代码如下:

char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{
  if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
  {
      return NULL;
  }
  char *strdest = dest; //保存目标字符串的首地址
  while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下
  return strdest;
}
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
  if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
return NULL;
  char *tempFrom = (char *)memFrom; //保存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

例如 char strl[10],str2[]={"QWERT"};
strcpy(str1,str2);
运行后是str1由{\0\0\0\0\0\0\0\0\0\0}变为{QWERT\0\0\0\0\0}

运行后是str1由{\0\0\0\0\0\0\0\0\0\0}变为{QWERT\0\0\0\0\0}

注意:
str1的长度必须大于str2,目的是有足够的空间容纳str2的东西;

又如:

char str1[100]="BCD";
char str2[100]="AAAAAAAA";
int i=0;
for(i=1;i<=4;i++)
{
memcpy(str2,str1,i);
printf("%s\n",str2);
}

输出结果:

BAAAAAAA
BCAAAAAA
BCDAAAAA
BCD

最新文章

  1. Win32 设置窗口透明度 SetLayerTransparent
  2. 答:SQLServer DBA 三十问之二:系统DB有哪些,都有什么作用,需不需要做备份,为什么;损坏了如何做还原(主要是master库)
  3. 【Bugly技术干货】那些年我们用过的显示性能指标
  4. FileOutputStream VS FileWriter
  5. 遇到一位ITer,一位出租车司机,必看。
  6. Iptables 报错Couldn't load target `ACCET':/lib64/xtables/libipt_ACCET.so: cannot open shared object file
  7. C# 多线程防止卡死
  8. httpd启动脚本
  9. C#的委托 Action&lt;&gt;和Func&lt;&gt;
  10. BestCoder Round #70 Jam&#39;s math problem(hdu 5615)
  11. Android AsynTask更新主界面
  12. 梯度下降算法的一点认识(Ng第一课)
  13. P4391 [BOI2009]Radio Transmission 无线传输(KMP)
  14. Java开发知识之Java字符串类
  15. 项目笔记-SC01
  16. 2017第45周一java多线程创建方法
  17. [administrator][driver] driverctl 是如何在udev上层管理设备驱动的
  18. nodejs异步读数据库
  19. 2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告
  20. Excel表导出

热门文章

  1. iOS中的#ifdef DEBUG为什么会在didFinishLaunchingWithOptions之前执行
  2. DuiLib事件分析(一)——鼠标事件响应
  3. Idea 常用快捷键列表
  4. 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&amp;资源效率
  5. VMware中给Linux虚拟机添加硬盘
  6. Ant安装、环境变量配置及验证
  7. gulp详细入门教程(转载)
  8. SharpZipLib 文件/文件夹压缩
  9. ECMAScript 6教程 (二) 对象和函数
  10. winform插件机制学习