字符串拷贝 sprintf、strcpy 及 memcpy 函数的区别

原创 2018年04月15日 10:40:18

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

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

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

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

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



查看原文:http://47.100.160.51/wordpress/?p=80

C++面向对象

小知识1 #include尽量不写到头文件中 因为在预编译时, 头文件会展开 在展开后, 如果头文件中包含了过多的头文件, 编译速度会变慢 尤其是自己编写的本地头文件​ 小知识2 可以使用预声明(前置声明)来解决不在头文件中include的问题 注意:预声明之后, 只能使用该类型的指针或者引用.
  • 2018年03月05日 21:21

strcpy,memcpy,sprintf的区别及前两个函数的实现

strcpy,memcpy,sprintf的区别及前两个函数的实现 snprintf 函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主...
  • peace_power
  • peace_power
  • 2013-07-01 00:23:29
  • 772

完成字符串拷贝(sprintf、strcpy 及 memcpy 函数)函数之间的区别

sprintf 可以进行额外的格式化 strcpy 会复制直到出现 '' 为止,可能溢出 strncpy 会复制一个以 '' 结束的字符串,但是如果字符串长度超过指定数量则被截断,但结果可能不包含...
  • ycguhang
  • ycguhang
  • 2013-02-19 21:25:29
  • 6421

strcpy、sprintf、memcpy的区别

最近在做远程升级的内容,通过实践才真正体会到不同拷贝函数的作用 char*strcpy(char *dest, const char *src); 其对字符串进行操作,完成从源字符串到目的字符串的...
  • lickylin
  • lickylin
  • 2012-08-12 12:55:27
  • 9143

sprintf、strcpy 、memcpy 的比较

sprintf、strcpy 、memcpy,都是常用的拷贝函数。到底它们之间有何不同呢?这里对它们用法特性做一下简单的对比和总结。...
  • fish43237
  • fish43237
  • 2015-01-12 00:38:35
  • 2195

strcpy/sprintf/memcpy的区别及适用场景

char*strcpy(char *dest, const char *src); 其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作...
  • weixin_36662608
  • weixin_36662608
  • 2016-12-15 18:51:20
  • 172

简述strcpy、sprintf与memcpy的区别

操作对象不同1.strcpy的两个操作对象均为字符串 2.sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串 3.memcpy的两个对象就是两个任意可操作的内存地址,并不限于何种数...
  • u011617097
  • u011617097
  • 2015-11-29 21:40:48
  • 349

编写字符串复制函数strcpy及memcpy函数

Strcpy与memcpy两函数的经典实现,哈哈,不过,不是偶写的!^_^………… char *strcpy(char *des, const char *src){       assert((de...
  • wuxinyicomeon
  • wuxinyicomeon
  • 2010-11-07 21:18:00
  • 7083

sprintf、strcpy 及 memcpy 函数的区别

http://jianjiaosun.blog.163.com/blog/static/1361244862010229101318487/ sprintf 可以进行额外的格式化 st...
  • u011248345
  • u011248345
  • 2013-08-21 17:49:45
  • 386

【字符串拷贝函数】memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy的区别

几种常见字符串拷贝函数的用法以及常见的出错可能
  • Deadwalk
  • Deadwalk
  • 2015-03-16 23:10:06
  • 2868
收藏助手
不良信息举报
您举报文章:字符串拷贝 sprintf、strcpy 及 memcpy 函数的区别
举报原因:
原因补充:

(最多只允许输入30个字)