sprintf()、 strcpy()和memcpy()函数比较
来源:互联网 发布:三级数据库历年真题 编辑:程序博客网 时间:2024/04/28 07:37
原文出处:百度
完成字符串拷贝可以使用 sprintf、strcpy及 memcpy函数
这些函数的区别在于实现功能以及操作对象不同。
strcpy 函数操作的对象是字符串,完成从源字符串到目的字符串的拷贝功能。
snprintf 函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。
memcpy 函数顾名思义就是内存拷贝,实现将一个内存块的内容复制到另一个内存块这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy的操作对象不局限于某一类数据类型,或者说可适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy函数等长拷贝的特点以及数据类型代表的物理意义,memcpy函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。
对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:
· strcpy无疑是最合适的选择:效率高且调用方便。
· snprintf要额外指定格式符并且进行格式转化,麻烦且效率不高。
· memcpy虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy函数一般是在内部调用 memcpy函数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy和 strcpy拷贝字符串在性能上应该没有什么大的差别。
对于非字符串类型的数据的复制来说,strcpy和 snprintf一般就无能为力了,可是对 memcpy却没有什么影响。但是,对于基本数据类型来说,尽管可以用 memcpy进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下 memcpy几乎不被使用。memcpy的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。
如果使用引用接收引用返回值,则返回的引用必须具有较长的生存期,不可以引用局部变量。如果使用引用接收值返回值,则引用了一个临时对象,该对象的生存期将延长到和这个引用相同。
- sprintf()、 strcpy()和memcpy()函数比较
- memcpy 、sprintf和strcpy 的比较
- memcpy sprintf strcpy 的比较
- sprintf,strcpy,memcpy的比较
- memcpy sprintf strcpy 的比较
- sprintf、strcpy 、memcpy 的比较
- sprintf、strcpy 及 memcpy 函数
- sprintf、strcpy 及 memcpy 函数
- sprintf、strcpy 及 memcpy 函数
- sprintf、strcpy 及 memcpy 函数的区别
- sprintf、strcpy和memcpy的区别
- sprintf、strcpy和memcpy的区别
- strcpy memcpy memset函数比较
- strcpy sprintf memcpy 异同
- sprintf、strcpy 及 memcpy
- Sprintf,Strcpy,Memcpy
- strcpy sprintf memcpy
- sprintf(),strcpy(),memcpy()
- xcode4中使用静态库和工作区
- 如何得到服务器端sql执行脚本的方法
- 关于ULARGE_INTEGER 在计算磁盘容量时候的运算
- JAVA实现 输入一串数字,转换成汉字显示
- c++ xcode提示错误:"vtable for UIPersonListView", referenced from:
- sprintf()、 strcpy()和memcpy()函数比较
- MySQL中information_schema
- mysql导入导出小经验
- C#中的泛型,与java。C++中泛型的区别
- Android电话系统rild-启动流程
- solaris 编译socket程序
- 实习 报告
- 向其他程序发送消息
- MySQL中UNION和UNION ALL的使用