snprintf容易误解的使用方法
自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:
int snprintf(char *str, size_t size, const char *format, …);
但是大家在使用snprintf的时候是否真的清楚参数里size的意思呢?看下面的例子:
假设我想将一个char类型的变量打印成2进制,我应该怎么写呢?
之前有个同事这样写的:
char a=‘a’;
char str[20];
snprintf(str,2,“%02x”,a);
对不对呢,错了。
1.2不应该是2,应该是3.
2.也不建议直接写3,应该写sizeof(str)
所以建议的写法是:
char a=‘a’;
char str[3];//再大点也没有问题
snprintf(str,sizeof(str),“%02x”,a);
解释如下:
size是限定最终生成的dest的字符数,最多拷贝size-1个字符; 一般情况下size会取sizeof(dest),这是为了dst不溢出. 在snprintf(dest, size, “str: %s\\n”, src)中如果size-1大于等于”str: %s\\n”的长度,则把”str: %s\\n”都拷贝到dst, 如果size-1小于”str: %s\\n”的长度,则从”str: %s\\n”拷贝size-1长度的字符串到dst,并且末尾置\\0.
对于返回值,需要注意的是snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。如:
char test[8]; int ret = snprintf(test,5,“1234567890″); printf(“%d|%s\\n”,ret,test);
运行结果为:
10|1234
好啦,想不到一个小小的snprintf还有这么多需要注意的地方吧~~~![]()
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: snprintf
- 发布时间:2009-11-17 23:18:35
-
[928] WordPress插件开发 -- 在插件使用 -
[134] 解决 nginx 反向代理网页首尾出现神秘字 -
[53] 整理了一份招PHP高级工程师的面试题 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 海量小文件存储 -
[51] 用 Jquery 模拟 select -
[50] 全站换域名时利用nginx和javascri -
[50] Innodb分表太多或者表分区太多,会导致内 -
[49] CloudSMS:免费匿名的云短信 -
[47] jQuery性能优化指南