我是靠谱客的博主 坚强流沙,最近开发中收集的这篇文章主要介绍snprintf用法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf.

 

自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:

int snprintf(char*str, size_t size,constchar*format, ...);

 

函数说明:

最多从源串中拷贝size-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为size的话,将不会溢出。

函数返回值:

若成功则返回欲写入的字符串长度,若出错则返回负值。

 

但是大家在使用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: %sn", src)中如果size-1大于等于"str: %sn"的长度,则把"str: %sn"都拷贝到dst; 如果size-1小于"str: %sn"的长度,则从"str: %sn"拷贝size-1长度的字符串到dst,并且末尾置.

就是说,拷贝的长度是size-1和源字符串长度的最小值;

对于返回值,需要注意的是snprintf的返回值是欲写入的字符串(即源字符串)长度,而不是实际写入的字符串度。如:

char test[8];int ret= snprintf(test,5,"1234567890"); printf("%d|%sn",ret,test);

运行结果为:
10|1234

 

linux和windows下是不同的

linux下用的是snprintf();
而windows下用的是_snprintf();

最后

以上就是坚强流沙为你收集整理的snprintf用法的全部内容,希望文章能够帮你解决snprintf用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部