snprintf()函数使⽤⽅法
众所周知,sprintf不能检查⽬标字符串的长度,可能造成众多安全问题,所以都会推荐使⽤snprintf.
⾃从snprintf代替了sprintf,相信⼤家对snprintf的使⽤都不会少,函数定义如下:
int snprintf(char*str, size_t size,constchar*format, ...);
函数说明:
最多从源串中拷贝size-1个字符到⽬标串中,然后再在后⾯加⼀个0。所以如果⽬标串的⼤⼩为size的话,将不会溢出。
函数返回值:
若成功则返回欲写⼊的字符串长度,若出错则返回负值。
但是⼤家在使⽤snprintf的时候是否真的清楚参数⾥size的意思呢?看下⾯的例⼦:
假设我想将⼀个char类型的变量打印成2位的10进制,我应该怎么写呢?
char a='a';
char str[20];
snprintf(str,2,"%02d",a);
字符串长度怎么求上⾯这么写,对不对呢,错了。
1) 2不应该是2,应该是3.
2) 也不建议直接写3,应该写sizeof(str)
所以建议的写法是:
char a='a';
char str[3];//再⼤点也没有问题
snprintf(str,sizeof(str),"%02d",a);
解释如下:
size是限定最终⽣成的dest的字符数,最多拷贝size-1个字符; ⼀般情况下size会取sizeof(dest),这是为了dest不溢出.
在snprintf(dest, size, "str: %s\n", src)中如果size-1⼤于等于"str: %s\n"的长度,则把"str: %s\n"都拷贝到dest; 如果size-1⼩于"str: %s\n"的长度,则从"str: %s\n"拷贝size-1长度的字符串到dst,并且末尾置\0.
就是说,拷贝的长度是size-1和源字符串长度的最⼩值;
对于返回值,需要注意的是snprintf的返回值是欲写⼊的字符串(即源字符串)长度,⽽不是实际写⼊的字符串度。如:
char test[8];
int ret= snprintf(test,5,"1234567890");
printf("%d|%s\n",ret,test);
运⾏结果为:
10|1234
最后,注意这个函数在linux和windows下是不同的linux下⽤的是snprintf(),⽽windows下⽤的是_snprintf();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论