一、定义

众所周知,sprintf不能检查目标字符串的长度,可能造成众多安全问题,所以都会推荐使用snprintf。自从snprintf代替了sprintf,相信大家对snprintf的使用都不会少,函数定义如下:

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

C 库函数 int snprintf(char *str, size_t size, const char *format, ...) 设将可变参数(...),按照 format 格式化成字符串,并将字符串复制到 str 中,size 是要写入的字符的最大数目,超过 size 会被截断。

参数

  • str -- 目标字符串。
  • size -- 拷贝字节数(Bytes)。
  • format -- 格式化成字符串。
  • ... -- 可变参数。

返回值

  • (1) 如果格式化后的字符串长度小于等于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0,
  • (2) 如果格式化后的字符串长度大于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,
  • (3)返回值为欲写入的字符串长度,若出错则返回负值。

二、实例

 int main(){char a[16];size_t i;i = snprintf(a, 13, "%012d", 12345);  // 第 1 种情况,12345复制到数组a中printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 000000012345, 12位i = snprintf(a, 9, "%012d", 12345);   // 第 2 种情况,超出的截断,只复制1到数组a中printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 00000001,9位return 0;
}

其他例子

 std::string printTime(const timeval &tv) {time_t sec_tmp = tv.tv_sec;struct tm *tm = localtime(&sec_tmp);char buf[128];snprintf(buf, sizeof(buf), "%d-%02d-%02d %02d:%02d:%02d.%03d",1900 + tm->tm_year,1 + tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,(int)(tv.tv_usec / 1000));return buf;}

另一个例子

假设我想将一个char类型的变量打印成2位的10进制,我应该怎么写呢?

  size_t i;char a = 'a';char str[20];i=snprintf(str,sizeof(str), "%02d", a);printf("i = %lu, a = %s\n", i, atr);    

运行结果:

解释如下:

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

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

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

参考:

https://www.cnblogs.com/LifeoFHanLiu/p/10797588.html

https://zhidao.baidu.com/question/681666154238656332.html

https://www.runoob.com/cprogramming/c-function-snprintf.html

C++snprintf的使用相关推荐

  1. C库函数:scanf、fscanf、printf、fprintf、sprintf、 snprintf

    1. scanf 函数原型 int scanf(const char *format, ...);  功能:从标准输入 stdin 读取格式化输入. 2.fscanf 函数原型 int fscanf( ...

  2. c++ 缓存和缓冲_【嵌入式C】放弃printf,选择了精简snprintf

    1.聊一聊 今晚平安夜,记得一定要吃苹果哦!同时提前祝大家圣诞快乐,Merry Christmas! 是一首超级有氛围感的圣诞歌曲,大伙可以听一听,请相信我的品位! 2.正文部分 对于printf相信 ...

  3. 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较

    问题: 函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), ...

  4. sprintf,sscanf,snprintf

    sprintf:将格式化的数据写入字符串,第一个参数是缓冲区buf.成功返回写字符的总数,失败返回一个负数 1.最简单用法: char str[20]; sprintf(str,"%d&qu ...

  5. 三个打印函数printf()/sprintf()/snprintf()区别

    先贴上其函数原型 printf( const char *format, ...)    格式化输出字符串,默认输出到终端-----stdout sprintf(char *dest, const c ...

  6. C语言函数 snprintf()(发送有限字符截断字符串输出到 str 所指向的字符串)(字符串拼接、截断拼接)

    相似函数: C语言sprintf函数(发送格式化输出到 str 所指向的字符串)(format 标签属性)(字符串拼接) 文章目录 描述 声明 参数 返回值 实例 C 标准库 - <stdio. ...

  7. 各种输出函数的比较(printf/fprintf/sprintf/snprintf/vprintf/vfprintf/vsprintf/vsnprintf)

    对于程序猿来说,printf函数可以说是最熟悉的一个工具了.利用它可以将各类调试信息输出到指定的设备(比如串口)中,实现对程序运行状态的掌控和分析.不过,在实际的应用中,相信大家除了printf函数之 ...

  8. linux c之snprintf()和sprintf()区别

    1.snprintf函数 int snprintf(char *str, size_t size, const char *format, ...); 将可变个参数(...)按照format格式化成字 ...

  9. 关于sprintf和snprintf的比较

    #include <stdio.h> #include <string.h>typedef unsigned char uchar;#define BUF_SIZE 10 // ...

  10. snprintf函数用法

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

最新文章

  1. Centos 下 Nginx 信号控制
  2. 再学 GDI+[33]: TGPPen - 画笔的几何变换 - SetTransform
  3. Spring boot配置Dubbo三种方式
  4. spring系列-注解驱动原理及源码-bean组件注册
  5. .net core 与ELK(2)安装Elasticsearch可视化工具
  6. Struts第一个案例搭建
  7. 2017年2月20日 Random Forest Classifier
  8. 求数组中的最小子数组,时间复杂度o(n),java
  9. javaone_JavaOne 2012:使用HTML5和Java构建移动应用程序
  10. 就知道你会没灵感,感恩节psd分层海报模板来咯!
  11. 分治法:快排划分法(单向扫描法)
  12. 64位装32位oracle软件,在64位linux下安装32位oracle软件
  13. 【线性代数】矩阵的特征值分解(对角化、谱分解)
  14. _validate_lengths‘ from ‘numpy.lib.arraypad
  15. Unity单人游戏集合
  16. Codeforces Round #521 (Div. 3) E. Thematic Contests(dp)
  17. The COMMIT TRANSACTION request has no corresponding BEGIN
  18. 香港银行开户多少钱能开下来
  19. 2:STM32CubeMX配置STM32F103C8T6驱动-TIM1配置
  20. 老王的电影网站 - 推荐系统入门(一)

热门文章

  1. 通用后台管理系统前端界面
  2. 为什么我建议你现在Vue 3?
  3. python 整行_python dataframe 输出结果整行显示的方法
  4. DIH-全量导入总结
  5. POJ_1849 Two
  6. node.js卸载与重装
  7. 使用kettle来根据时间戳或者批次号来批量导入数据,达到增量的效果。
  8. 华擎主板bios设置图解_华擎主板bios设置_华擎主板bios设置图解_asrock主板bios设置...
  9. 电话号码查询系统(链式结构)
  10. 用Bibtex导出GB/T 7714等格式引用的方法