memcpy sprintf strcpy 的比较

今天去面试,被问到了一个基础问题,居然没有回答上来,差点被挂,在网上看到一篇博客,于是乎转载了过来,用以永远记住那个尴尬的时刻,从而鞭策自己不断进取。

问题就是:说说memcpy和strcpy的了解


http://blog.csdn.net/lovemysea/article/details/5275611

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

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

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

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

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

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

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

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

对于非字符串类型的数据的复制来说,strcpy 和 sprintf 一般就无能为力了,可是对 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是对内存区域的复制。当然,不仅能够复制字符串数组,而且能够复制整型数组等其他数组。

以上就是原文,需要指出的是,原文中'\0'写成了'/0',并且本人在做实验时,发现用printf打印最后结果时,strcpy和memcpy的结果是一样的,原来

printf也是格式化输出,遇到'\0'结束输出。可以通过调试来查看变量的值。或者用其他函数输出,还请高手指教。


`memcpy`和`sprintf`是两个在C语言中用于处理字符串和内存复制的函数,它们之间有以下区别: 1. 功能不同: - `memcpy`函数用于在内存中进行字节级别的复制,可以将一块内存的内容复制到另一块内存中,不涉及字符串格式化操作。 - `sprintf`函数用于将格式化的数据写入字符串中,将不同类型的数据格式化为字符串并写入指定的缓冲区。 2. 参数不同: - `memcpy`函数的参数包括源内存地址、目标内存地址和要复制的字节数,用于指定复制的源数据和目标位置。 - `sprintf`函数的参数包括目标字符串缓冲区、格式化字符串和要格式化的数据,用于指定将数据格式化后写入的字符串缓冲区。 3. 返回值不同: - `memcpy`函数没有返回值或者返回一个指向目标内存地址的指针。 - `sprintf`函数返回写入到字符串缓冲区的字符数,或者出现错误时返回负值。 4. 使用场景不同: - `memcpy`函数常用于需要直接进行内存拷贝操作的情况,例如将一个数组或结构体的内容复制到另一个数组或结构体中。 - `sprintf`函数常用于对数据进行格式化并写入到字符串中的情况,例如将数字转换为字符串、拼接字符串等。 需要注意的是,`sprintf`函数容易引发缓冲区溢出的问题,因此在使用时应该确保目标字符串缓冲区足够大,并且对格式化字符串的安全性进行验证。如果是简单的字符串拷贝操作,建议使用安全的函数如`strcpy`或`strncpy`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值