为什么用strlcpy取代strncpy

为什么用strlcpy取代strncpy

标签: CC语言strlcpystrncpy

最近看模块代码,发现字符串的拷贝都用的strlcpy,所以就查了查用strlcpy取代strncpy的原因。

详细内容请看:http://www.gratisoft.us/todd/papers/strlcpy.html

 

简单总结几点: 
1. strcpy是最不安全拷贝字符串函数,因为src串的长度有时会很长。随后strncpy函数为了解决这个问题出现了,但这个函数有些地方实现得也很诡异,它对于字符串末尾的’\0’处理不是很好。

例1: 
char str[11]; 
strncpy(str, "hello world", 11);

在例1中只会把str数组填满,但这个字符串却没有’\0’的结束符。

例2: 
char str[20]; 
strncpy(str, "sample", 15);

在例2中,15远远大于了字符串"sample"的长度,这时strncpy要在剩下的部分补充’\0’。首先说这样会影响效率,其次对于static或者calloc这样已经初始化的数组根本不需要填写’\0’。 
因此在使用strncpy拷贝字符串时,通常要这样写,

例3: 
strncpy(path, homedir, sizeof(path) – 1); 
path[sizeof(path) – 1] = ‘\0′;

2. 而strlcpy可以自动处理末尾’\0’的问题

size_t strlcpy(char *dst, const char *src, size_t size);

然而strlcpy不是ANSI C函数,一般在linux下使用。

原文链接:为什么用strlcpy取代strncpy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值