众所周知,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: %s\n", src)中如果size-1大于等于"str: %s\n"的长度,则把"str: %s\n"都拷贝到dst; 如果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();

snprintf用法相关推荐

  1. snprintf用法解析

    int snprintf ( char * s, size_t n, const char * format, ... ); 描述: 将格式化的输出写入大小缓冲区 如果在printf上使用了格式,则将 ...

  2. linux下snprintf用法,关于snprintf,_snprintf,_snprintf_s操作

    一.snprintf与snprintf_s的区别 众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf. snprintf函数在C++11之前 并不 ...

  3. c语言snprintf用法,snprintf和string操作函数(示例代码)

    首先,使用场景不同.除了snprintf之外,其他的都是用于两个字符串之间进行比较.拷贝.拼接等操作的,而snprintf最主要是,要把一个用户变量按照一个format打印到字符串中. 其次,函数参数 ...

  4. snprintf函数用法

    int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...

  5. snprintf函数的用法详解

    c语言的snprintf函数的用法详解 snprintf()函数是一种格式化函数,用于将格式化的字符串存储到一个字符数组中,并且有一个参数用来限制输出的最大字符数. 语法: int snprintf ...

  6. linux进程snprintf函数功能,linux 之 snprintf函数用法

    int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...

  7. strncpy,snprintf,strnlen的用法

    1,不使用strcpy和sprintf,它们可能导致缓冲区溢出 2,strncpy的用法 char *strncpy(char *dest, const char *src, size_t n); 标 ...

  8. reprint函数的用法c语言,百篇大计敬本年之C语言巅峰之道《五》—— snprintf 是否需要 memset 缓冲区...

    代码中经常用到 snprintf 函数,每次使用前都会 memset 一下缓冲区,感觉效率不高,今天突然想到是否真需要在使用前进行memset操作呢? 网络上找到的说法有些说不需要,有些说养成习惯. ...

  9. C语言snprintf()函数用法

    一.函数原型 snprintf(),为函数原型int snprintf(char *str, size_t size, const char *format, ...). 二.函数介绍 将可变个参数( ...

最新文章

  1. LAMBDA表达式常用 (全)
  2. 服务器区分几位系统吗,怎么区分服务器是几个CPU,几核
  3. java高分面试指南:java定时删除文件
  4. 和 Python 2.x 说再见!
  5. Cesium入门-3-官方完整实例
  6. 基于springboot的鲜花商城系统
  7. 最适合Java程序员的Java学习全套资料分享
  8. linux怎样判断vim是否安装上,Linux系统中vim的安装
  9. 苹果输了官司,iPad会改名吗?
  10. js练习题:对象字面量的形式创建一个名字为可可的狗对象
  11. 专家称“988”心理健康热线是一次“变革”,但目前运营上面临困境
  12. C#获取本机局域网ip和公网ip
  13. IOS手游开发设计与实现
  14. 深入理解Java虚拟机——加载和存储指令
  15. Linux安装教程以及开发板预学习
  16. 判定的测试,语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,组合覆盖,修正的判定条件覆盖
  17. 找出一个二维数组中的鞍点,即该位置上的的元素,在该行上最大,该列上最小,也可能没有鞍点
  18. java调用tshark_libtshark-core
  19. 基于GAN框架的时间序列异常检测研究综述
  20. 变频调速器安装操作检测维护技术实训系统

热门文章

  1. SolidWorks 2008机械设计一册通
  2. VovSoft Hide Files 文件加密隐藏工具中文版
  3. python-识别验证码
  4. 7、大数据中常见的文件存储格式以及hadoop中支持的压缩算法
  5. 学校头哥作业7_集合与字典(头哥作业[Python])
  6. 易手,换帅,裁员,酷6视频之路已尽
  7. 汇编统计正负数 . debug (滚雪球式写代码)
  8. 两个线程调用同一个对象的同一个方法
  9. 送4G金士顿U盘了,先到先得
  10. 『转载』 SSL协议与数字证书原理