C++字符串复制/拷贝

snprintf

sprintf不能检查目标字符串的长度,可能造成众多安全问题, snprintf是的sprintf的安全版本,他的特点是安全,不管怎么着,它都能保证结果串str以\0结尾,哪怕dst_size不够大,它都能做好截断,同时在末尾添加上\0。

int snprintf(char *str, size_t size, const char *format, ...);

函数说明:
最多从源串中拷贝size-1个字符到目标串中,然后再在后面加一个\0。所以如果目标串的大小为size的话,将不会溢出。

函数返回值:
若成功则返回欲写入的字符串长度,若出错则返回负值。

性能:
当source_str远长于dst_size时,该函数却很低效的,其他情况下该函数即安全又高效。
当source_str远长于dst_size时,该函数低效,是因为该函数的返回值为source_str的长度,那么它就必须将source_str全部过一遍,哪怕并不拷贝到dst_str中去。
注意,当source_str长度比dst_size小时,它不会把末尾的多余字符置零,所以它是很高效的,不会多做无用功。

char source='s';
char str[3];								//长度做好是sizeof(source) + 1,再大点也没有问题,因为snprintf最多从源串中拷贝size-1个字符到目标串中;
snprintf(str,sizeof(str),"%s",source); 		//建议size位传入sizeof(str),源串中拷贝size-1个字符到目标串中

memcpy

从源source所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

void *memcpy(void *destin, const void *source, int n);

函数返回一个指向dest的指针。
1.source和destin所指内存区域不能重叠,函数返回指向dest的指针。   
2.与strcpy相比,memcpy并不是遇到’\0’就结束,而是一定会拷贝完n个字节。   
3.如果目标数组dest本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
在需要用到字符串拷贝函数的时候,永远不要使用strncpy(),无论什么时候都用snprintf()来代替,而memcpy()是性能更好的实现方式。

来都来了,点个赞再走吧!
创作不易,多谢支持~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值