strncpy与snprintf的正确用法

一、strncpy

strncpy的正确用法:

char *strncpy(dest, src, sizeof(dest)-1);

或者

strncpy(dest, src, sizeof(dest));
dest[sizeof(dest)-1] = ‘/0’;

strncpy的问题:

  1. size一定要用sizeof(dest)sizeof(dest)-1,不可误用sizeof(src).
  2. 手工填0, 务必要把dest的最后一个字节手工设置为0。因为strncpy仅在src的长度小于dest时,对剩余的字节填0。
  3. 性能问题。当dest长度远大于src时,由于strncpy会对多余的每个字节填0,会有很大的性能损失。
  4. 返回值char,返回最终复制的字符串。strncpy返回dest,因而无法知道拷贝了多少个字节。

二、snprintf

snprintf的正确用法:

int snprintf(dest, sizeof(dest), "%s", src);

snprintf的问题:

  1. 不可省略第三个参数"%s"。隐患:如果src中包含%,会引发core
  2. 性能问题。当src长度远大于dest时,由于snprintf要返回src的字节数(参见:http://blog.bitfly.cn/post/c-safe-str-cpy/),需要扫描src,会有很大的性能损失。
  3. 返回值int。如果当前buf够用,返回实际写入的字符数;如果不够用,返回将要写入的字符数。换句话说,返回值就是传入的字符数目

总结:

  1. snprintf使用比strncpy简洁。
  2. snprintf可以获取被拷贝的字节数。
  3. 二者都有性能问题。如果src远大于dest,用strncpy;如果dest远大于src,用snprintf。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值