众所周知,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. FreeRTOS 中 systick 相关配置

    @2018-7-16 > systick 属性配置 在文件 <port.c> 中函数 void vPortSetupTimerInterrupt( void ) 中配置计数周期.时钟 ...

  2. 【转】cJSON 源码阅读笔记

    前言 cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用. 而且 cjson 还有很多不完善的地方, 推荐大家看完之后自己实现一个 封装好的功能完善的 cjson 程序. json ...

  3. RabbitMQ安装详解

    # RabbitMQ 消息中间件 一.安装:#安装epel源[EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包)rpm -Uvh htt ...

  4. jar文件放在桌面上双击启动不了,但放在其它任何文件夹里都可以双击启动

    今天本来是想尝试一下Java Network Launching Protocol (JNLP,java网络加载协议) 的,写了一个简单的窗口程序,打包成jar保存到桌面上,双击等了半天没显示出来. ...

  5. bug6 项目检出JRE问题(Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'idweb')

    项目从SVN检出到工作空间后报了很多错误,其中很明显就是一些jar的问题,没有相关的jar或版本问题,看到最后的错误Unbound classpath Container: 'JRE System L ...

  6. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  7. 51job_selenium测试

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  8. GO语言的进阶之路-初探GO语言

    GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...

  9. Nginx使用Location匹配URL进行伪静态

    基础知识 Nginx location 配置语法 1. location [ = | ~ | ~* | ^~ ] uri { ... } 2. location @name { ... } locat ...

  10. JS 求一组数中所有数的和以及平均值

    var arr = [10,20,30]; //计数器思想 var sum = 0; for(var i=0;i<arr.length;i++){ sum += arr[i]; } consol ...