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

  注:sprintf()函数:int sprintf( char *buffer, const char *format, [ argument] … );返回的是实际写入buffer的长度

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

int snprintf(char* dest_str,size_t size,const char* format,...);

函数说明

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

函数返回值

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

  注:这里返回的长度是格式化数据的长度。

  但是大家在使用snprintf的时候是否真的清楚参数里size的意思呢?看下面的例子:
  假设我想将一个char类型的变量以16进制存储,我应该怎么写呢?

  之前有个同事这样写的:

char a='a';
char str[];
snprintf(str,,"%02x",a);//字符a的十六进制是61

  对不对呢,错了。

  1)2不应该是2,应该是3。

  2)也不建议直接写3,应该写sizeof(str)

   注:sizeof包含求字符串长度时,包含最后的结束符'\0'

  所以建议的写法是:

char a='a';
char str[];//再大点也没有问题
snprintf(str,sizeof(str),"%02x",a);

  解释如下

  size是限定最终生成的dest_str的字符数,最多拷贝size-1个字符;一般情况下size会取sizeof(dest_str),这是为了dest_str不溢出。

  在snprintf(dest_str,size,"str:%s\n")中如果size-1大于等于"str:%s\n"的长度,则把"str:%s\n"都拷贝到dest_str;如果size-1小于"str:%s\n"的长度,则从"str:%s\n"拷贝size-1长度的字符串到dst,并且末尾置'\0'。

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

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

char test[];int ret= snprintf(test,,""); printf("%d|%s\n",ret,test);

运行结果

10|1234

Linux和windows下是不同的

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

【转】snprintf()函数使用方法的更多相关文章

  1. [C/C++基础] C语言常用函数sprintf和snprintf的使用方法

    Sprintf 函数声明:int sprintf(char *buffer, const char *format [, argument1, argument2, …]) 用途:将一段数据写入以地址 ...

  2. [misc]printf/fprintf/sprintf/snprintf函数

    转自:http://blog.csdn.net/To_Be_IT_1/article/details/32179549 需要包含的头文件 #include <stdio.h> int pr ...

  3. Matlab中函数定义方法

    Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件 ...

  4. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  5. String类中的一些函数使用方法

    最常用的就是Length()函数了,求字符串的长度 String s="";int i=s.length();i结果为0. 如果是String s=null;int i=s.len ...

  6. FastReport里面正确调用函数的方法

    FastReport里面正确调用函数的方法   错误:  [FormatDateTime('yyyy-mm-dd',[frxDBDataset1."日期"])] --------- ...

  7. asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结

    通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...

  8. [xcode]Xcode查找函数(方法)调用及被调用

    参考资料:http://stackoverflow.com/questions/7145045/find-method-references-in-xcode 这个功能有的说是 Find Caller ...

  9. 学习笔记:jquery1.9版本后废弃的函数和方法

    jQuery1.9+ 废弃的函数和方法 升级Jquery版本遇到的问题 (转载自:http://www.ppblog.cn/jquery1-9live.html  版权归原作者所有) jQuery1. ...

随机推荐

  1. [AHOI2014/JSOI2014] 解题报告

    [AHOI2014/JSOI2014] 奇怪的计算器 一个很关键的结论,任何时候每个数的相对大小是不变的. 于是可以把这个相对大小当成线段树的权值,每次只需要维护一下区间极值和tag就好了,关于操作四 ...

  2. selenium 登陆小技巧

    from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Fi ...

  3. android广播(内部类)使用

    1.广播定义在一个单独的文件中 源码: public class MessageReceiver extends BroadcastReceiver{ @Override public void on ...

  4. Spring详细教程

    Spring学习总结---- 一.导入Spring必须的jar包 二.简单示例入门注入一个User 1.编写User实体类 package test.Spring.helloworld; import ...

  5. CF1080

    emmmm......ouuan大佬上紫了,我却没打...... 首先吐槽一波家长会和机房锁门,害我只能来打虚拟赛. 写了abcd四题,还是被ouuan大佬吊打....... 264名,应该能上分吧. ...

  6. spring aop 获取request、response对象

    在网上看到有不少人说如下方式获取: 1.在web.xml中添加监听 <listener>          <listener-class>              org. ...

  7. java web 使用maven打包绕过单元测试

    <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-suref ...

  8. (转)Maven之自定义archetype生成项目骨架

    背景:最近在开发一个项目的基础构件,在以后项目的开发过程中可以直接使用该构件快速的生成项目骨架进行开发. 摘要:使用过Maven的人都知道maven中有许多功能都是通过插件来提供的,今天我们来说一下其 ...

  9. 右值引用&&

    以下内容参考https://blog.csdn.net/china_jeffery/article/details/78520237 右值引用若不作为函数参数使用,基本等于滥用 右值引用 (Rvalu ...

  10. python2.x到python3.x函数变化

    首先,python 3.x中urllib库和urilib2库合并成了urllib库. 其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Re ...