以前习惯性的使用snprintf,刚才看一个以前别人写的API,发现里边大量使用strncpy, 本能的不习惯,由于木有strncpy的实现代码,只好测试一下,结果测试结果一下把我雷到了,废话不多说,直接上代码
注意这个代码的执行结果
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- const char *p = "123456789";
- const char *p2 = "12345";
- char buf[2];
- strcpy(buf, p);
- strncpy(buf, p2, 2);
- // snprintf(buf, 3, "%s", p2);
- printf("%s \n", buf);
- return 0;
- }
结果如下: 123456789 ,木有想到吧,自己把结束符给冲掉了,但是有些同学可能会说,我在我的代码里用的好好的啊!ok, 下面演示一下如何得到正确结果
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- const char *p = "123456789";
- const char *p2 = "12345";
- char buf[20];
- strcpy(buf, p);
- strncpy(buf, p2, sizeof(buf));
- // snprintf(buf, 3, "%s", p2);
- printf("%s \n", buf);
- return 0;
- }
结果如下: 12345
ok, 这个时候这个结果是正确的
总结:
strncpy 用了一种奇怪的方式来实现,它在从src 拷贝 数据到dest的过程中没有检查 n, 如果n大于src的长度,它会在dest里正常加上‘\0’, 但是如果不幸出现了意外,src的长度大于n,那么悲剧就出现了
结论:
慎用strncpy, 或者永远不要用这个函数,无论什么时候都用snprintf替代
阅读(1621) | 评论(0) | 转发(0) |