Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156272
  • 博文数量: 39
  • 博客积分: 1395
  • 博客等级: 中尉
  • 技术积分: 413
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-26 15:07
文章分类

全部博文(39)

文章存档

2012年(5)

2011年(16)

2010年(14)

2009年(4)

我的朋友

分类: C/C++

2012-04-10 19:57:26

以前习惯性的使用snprintf,刚才看一个以前别人写的API,发现里边大量使用strncpy, 本能的不习惯,由于木有strncpy的实现代码,只好测试一下,结果测试结果一下把我雷到了,废话不多说,直接上代码
注意这个代码的执行结果

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.     const char *p = "123456789";
  6.     const char *p2 = "12345";

  7.     char buf[2];
  8.     strcpy(buf, p);
  9.     strncpy(buf, p2, 2);
  10. // snprintf(buf, 3, "%s", p2);

  11.     printf("%s \n", buf);

  12.     return 0;
  13. }
结果如下: 123456789 ,木有想到吧,自己把结束符给冲掉了,但是有些同学可能会说,我在我的代码里用的好好的啊!ok, 下面演示一下如何得到正确结果

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.     const char *p = "123456789";
  6.     const char *p2 = "12345";

  7.     char buf[20];
  8.     strcpy(buf, p);
  9.     strncpy(buf, p2, sizeof(buf));
  10. // snprintf(buf, 3, "%s", p2);

  11.     printf("%s \n", buf);

  12.     return 0;
  13. }
结果如下: 12345 
ok, 这个时候这个结果是正确的

总结:
strncpy 用了一种奇怪的方式来实现,它在从src 拷贝 数据到dest的过程中没有检查 n, 如果n大于src的长度,它会在dest里正常加上‘\0’, 但是如果不幸出现了意外,src的长度大于n,那么悲剧就出现了

结论:
慎用strncpy, 或者永远不要用这个函数,无论什么时候都用snprintf替代

阅读(1626) | 评论(0) | 转发(0) |
0

上一篇:gsoap USCORE出现原因及解决办法

下一篇:没有了

给主人留下些什么吧!~~