strcpy()和strncpy()的缺陷与改进

strcpy()的缺陷

strcpy 函数原型为char *strcpy(char *dest,const char *src); 
函数说明:strcpy函数会将参数src字符串拷贝至参数dest所指的地址。

1、无限拷贝至溢出
在进行strcpy()自我复制时有可能出现无限复制的情况。
举例如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char ar[10] = {"abcdefg"};
	strcpy(ar+6,ar);
}

进行如上操作时,拷贝字符串时永远不会遇到‘\0’,因此会不断复制直至冲破ar的大小,导致溢出。👇👇👇👇
在这里插入图片描述
2、改进
在使用strcpy前进行长度判断能大大降低这种错误。

strncpy()的缺陷

函数原型为:char *strncpy(char *dest,const char *src ,size_t n);
函数说明:此函数将src所指向的地址拷贝前n个字符至参数dest所指向的地址。

1、性能损失
当dest长度远大于src时,由于strncpy会对多余的空间都填0,会造成性能损失。
2、n的大小未知
strncpy返回dest,因而不知道拷贝了多少个字节。
3、‘\0’的处理
从源指向的开始拷贝n个字符到目标指向地址,n大于源串长度时,遇到’\0’结束; n小于源串长度时,到第n个字符结束,但不会在目标串尾补’\0’。

因此在使用时注意在后面手动填‘\0’
用sizeof(dest)或sizeof(dest)-1确定目标指向地址的末尾,不可误用sizeof(src).
strncpy(dest, src, sizeof(dest));
dest[sizeof(dest)-1] = ‘\0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值