sprintf()、 strcpy()和memcpy()函数比较

来源:互联网 发布:三级数据库历年真题 编辑:程序博客网 时间:2024/04/28 07:37

原文出处:百度

完成字符串拷贝可以使用 sprintfstrcpy memcpy函数

 

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

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

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

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

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

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

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

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


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

 

如果使用引用接收引用返回值,则返回的引用必须具有较长的生存期,不可以引用局部变量。如果使用引用接收值返回值,则引用了一个临时对象,该对象的生存期将延长到和这个引用相同。

原创粉丝点击