这些函数的区别在于 实现功能 以及 操作对象 不同。

strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。

snprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。

memcpy 函数顾名思义就是 内存拷贝,实现 将一个 内存块 的内容复制到另一个 内存块 这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。

对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:

strcpy 无疑是最合适的选择:效率高且调用方便。

snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。

memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。

对于非字符串类型的数据的复制来说,strcpy 和 snprintf 一般就无能为力了,可是对 memcpy 却没有什么影响。但是,对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下 memcpy 几乎不被使用。memcpy 的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。

另外,
strcpy和memcpy功能上也有些差别:
比如:
const char *str1="abc/0def";
char str2[7];

首先用strcpy实现:
strcpy(str2,str1)
得到结果:str2="abc";也就是说,strcpy是以'/0'为结束标志的。

再用memcpy实现:
memset(str2,7);
memcpy(str2,str1,7);
得到结果:str2="abc/0def";
也就是说,memcpy是对内存区域的复制。当然,不仅能够复制字符串数组,而且能够复制整型数组等其他数组。

转载于:https://www.cnblogs.com/springside4/archive/2010/12/20/2481713.html

memcpy、strcpy、snprintf的区别相关推荐

  1. memcpy, strcpy, strncpy的区别和用法

    注意事项 strcpy 是依据 "\0" 作为结束判断的,如果 s2 的空间不够,则会引起 buffer overflow. memcpy用来在内存中复制数据,由于字符串是以&qu ...

  2. strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove

    strcpy和strncpy区别(2009-04-27 15:48:52) 转载标签:杂谈 分类:C++/C 第一种情况: char* p="how are you ?"; cha ...

  3. memcpy和memmove的区别以及内存重叠问题

    memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...

  4. c语言strdup,C语言中的strdup()函数和其与strcpy()函数的区别

    头文件: #include 定义函数: char * strdup(const char *s); 函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s ...

  5. strdup与strcpy具体的区别

    我分别在XP的环境和linux环境下编译运行C代码,我发现一个不解的现象: 现象描述: 两个字符串 char* from, char* to;要把from的内容复制给to. 我在XP下,用strcpy ...

  6. memset,memcpy,strcpy 的区别

    一.函数原型 strcpy extern char *strcpy(char *dest,char *src); #include <string.h> 功能:把src所指由NULL结束的 ...

  7. strcpy、memcpy和memset的区别

    strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字 ...

  8. C之memset、memcpy、strcpy、strncpy区别

    1 memset memset  用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为' '或'\0', memset可以方便的清空一个结构类型的变量或数组. char a[100 ...

  9. memcpy,strcpy,strncpy

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  10. memcpy与memmove的区别

    memmove 和 memcopy 1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返 ...

最新文章

  1. Thrift的java和php数据交互
  2. 小工匠聊架构-分布式场景下的并发幂等性常见的解决方案
  3. Pandas matplotlib 无法显示中文 Ubuntu16.04
  4. 【渝粤教育】 广东开放大学 21秋期末考试组织行为学10068k2
  5. 【2017年第2期】社交网络分析在公共安全领域的应用
  6. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(三)
  7. 汇编语言基础之二 - 各种寻址和过程进出简介
  8. 基于Packet Tracer 的校园网络设计方案(计算机网络与课程实验)(一)——子网划分方案规划
  9. 5步绘制软件开发流程图
  10. get请求中url传参中文乱码问题
  11. Codevs3315时空跳跃者的魔法
  12. 浅尝辄止_数学建模(笔记_时间序列分析及其SPSS实现)
  13. 利用kettle HTTP Client 获取百度API区域位置内相关信息,并解析json
  14. Pycharm全局搜索关键字
  15. Lua中,泛型for循环遍历table时,ipairs和pairs的区别
  16. 任天堂ns显示育碧服务器错误是什么意思,网络连接错误代码
  17. 解决json_encode中文乱码情况
  18. 2020-04-14
  19. react的行内样式和外链样式
  20. js 根据出生年月计算年龄 精确到天

热门文章

  1. 如何快速将一个lista集合中的部分字段值组合成新的的listb部分*
  2. mitmproxy抓包软件在mac上边的安装
  3. 面向对象--选课系统作业
  4. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)
  5. css3模拟jq点击事件
  6. swift 系统自带的约束使用
  7. 一个好的移动广告平台是广告主盈利的关键
  8. 使用Pixel Bender Toolkit制作特效——给过滤器增加参数(Part 3)
  9. RichTextBox中插入图片
  10. c#2.0语法新关键字 partial