Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251970
  • 博文数量: 45
  • 博客积分: 802
  • 博客等级: 军士长
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-08 12:21
文章分类
文章存档

2014年(4)

2013年(4)

2012年(37)

我的朋友

分类: C/C++

2013-10-02 23:18:02

网上看到的,转载过来。coding的时候要格外注意
原文:http://blog.csdn.net/eroswang/article/details/6076987

strncpy的正确用法:

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

snprintf的正确用法:

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

strncpy的问题:

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

snprintf的问题:

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

总结:

  1. snprintf使用比strncpy简洁。
  2. snprintf可以获取被拷贝的字节数。
  3. 二者都有性能问题。如果src远大于dest,用strncpy;如果dest远大于src,用snprintf。
阅读(2632) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~