众所周知,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. 【洛谷P1230】智力大冲浪

    题目大意:给定 N 项任务,每项任务有一个截至完成时间,若在截止时间之后完成要罚款 \(w_i\) 元,最初有 M 元,怎样完成能够留下最多得钱. 题解:按照罚款从多到少贪心,在查找能够最晚完成一项任 ...

  2. std::lock_guard和std::unique_lock

    std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活 https://www.cnblogs.com/xudong-bupt/p/9194394.ht ...

  3. Node.js npm uuid

    nodejs 提供了一个 node-uuid 模块用于生成 uuid 使用方法为 const uuidV1 = require('uuid/v1'); uuidV1(); 或者为 const uuid ...

  4. malloc创建三维数组

    #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { //f[0],f[] ...

  5. MATLAB:图像乘除法运算(immultiply、imdivide函数),同时比较双精度类型图像运算结果

    图像乘除法运算涉及到immultiply.imdivide函数,实现代码如下: 1.图像之间的乘法运算 close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear ...

  6. Cotex-M4简介

    ARM Cortex™-M4 处理器是由 ARM 专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场. 高效的信号处理功能与 Cortex-M 处理器系列 ...

  7. CM记录-Hadoop运维管理

    1.自动化运维--cloudera manager 2.手动运维 a.启动./start.all.sh,停止./stop-all.sh b.hdfs启动/停止:./start-dfs.sh   ./s ...

  8. jQuery基础 (一)——样式篇(jQuery选择器)

    一.选择器类型 id选择器 class选择器 元素选择器 层级选择器 全选择器(*选择器) 二.有几种方式可以隐藏一个元素: CSS display的值是none. type="hidden ...

  9. ZRender

    https://ecomfe.github.io/zrender-doc/public/

  10. .NET面试题系列(十四)锁

    锁 分布式锁 如何解决分布式锁超时问题 我们可以让获得锁的线程开启一个守护线程,用来给快要过期的锁“续航” 当过去了29秒,线程A还没执行完,这时候守护线程会执行expire指令,为这把锁“续命”20 ...