一、函数概要
snprintf函数是sprintf函数的安全版本,因为它在调用的时候需要指定缓冲区的最大尺寸,这样可以有效避免缓冲区的益处。
如果写入的字符串尺寸大于size-1,那么后边的字符串将被丢弃,但是依旧会统计进长度中(返回值)。
format参数后边的额外参数数量是由format决定的,具体用法请参考printf函数中格式化占位符的解释。

将可变个参数(...)按照format格式化成字符串,然后将其复制到str中

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0'); 
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0')

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

函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。

二、函数原型

#include<stdio.h>
int snprintf(char *str, size_t size, const char *format, ...);

三、参数解析

参数 含义
str 指向存放结果字符串的缓冲区
size  1.限定缓冲区最大可写入的字节数
2.字符串最多可以拥有size-1 个字符串,最后一个空位用于存放‘\0'
3.size_t 被定义为无符号整型
format 格式化字符串
...  可选参数,具体请参考printf函数文档

四、返回值
 如果指定size的缓冲区足够存放写入的字符,返回值是实际写入的字符数(不包含表示字符串结束的‘\0’);
 如果函数调用失败,返回值是一个负数。

五、功能  :合并字符串、整形变量转换成字符串
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串。

六、注意

1.试图写入字符的数量超过size,并不会导致错误发生,只是超过部分被丢弃。

2.只有当返回值小于size 且非负数,才证明字符串被完全写入。

举例:

1、整型数字转换为字符串

#include<stdio.h>
int main()
{char testdstchar[10]={0};int j = 12;snprintf(testdstchar,sizeof(testdstchar), "%d", j);printf("%s",testdstchar);return 0;
}

输出:12

2、浮点型转换为字符串

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;  int main() {  char a[10];  double i = 12.532423;  snprintf(a, sizeof(a), "%lf", i);      cout << a << endl;  snprintf(a, sizeof(a), "%0.2lf", i); //设置转换的精度  cout << a << endl;
}  

输出结果为:

12.532423
12.53

3、拷贝字符串

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;  int main() {  char a[10];  char c[] = "dskcdsvkjgch";  snprintf(a, sizeof(a), "%s", c);    //以a的数组长度作为转换的位数,则最多拷贝9为,最后加\0。  cout << a << endl;                snprintf(a, sizeof(c), "%s", c);    //以c的字符长度作为转换的位数,系统会自动将a的数组长度调整到刚好能匹配c的字符。  cout << a << endl;
}  

输出结果:

dskcdsvkj

dskcdsvkjgch

使用snprintf的另一个好处是可以实现字符串的连接,再加上其相对安全的功能,strcat基本就可以抛弃了

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;  int main() {  char a[10];  char c[] = "dskc";  snprintf(a, sizeof(a), "%s", c);  //以数组名作为参数,实际上是从数组 第一位开始拷贝字符。  cout << a << endl;  snprintf(a+4, sizeof(a), "%s", c);  //实现连接,要注意连接开始的位置,之前a的前四位有字符,因此从第五位开始,对应数组脚标4,小于4,则之前的字符被覆盖,大于4,则a[4]为'\0';  cout << a << endl;
}  

输出结果:

dskc

dskcdskc

需要注意的几点:

1、函数的返回值

snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。

#include<stdio.h>int main()
{char testdstchar[10]={0};int j = 12;int ret = 0;ret = snprintf(testdstchar, 5,"123456789");printf("%d|%s",ret,testdstchar);return 0;
}

输出: 9|1234

#include<stdio.h>int main()
{char testdstchar[10]={0};int j = 12;int ret = 0;ret = snprintf(testdstchar, 11,"12345678901234567890");printf("%d|%s",ret,testdstchar);return 0;
}

输出:20|1234567890

2、利用snprintf函数来提前获取需要的内存空间大小.

按如下格式调用:int ret = snprintf(NULL,0,"%s%d","test", 123); //结果ret为7   
即设置第一二个参数分别为NULL和0,获得的ret就为实际需要的内存空间大小。这对于打印长度不可预知的字符串比较有效,便于我们合理分配空间,既不浪费又不产生截断。   

(1)如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束('\0');   

(2)如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0')

3、snprintf处理原始和目标缓冲区重叠时,会出现不可预期的结果。

#include<stdio.h>int main()
{char testdstchar[10]="abcdefg";int j = 12;int ret = 0;ret = snprintf(testdstchar, 10,"%s,hello",testdstchar);printf("%d|%s",ret,testdstchar);return 0;
}

输出:6|,hello

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. 【自译】八步成为数据科学家
  2. DNS区域传送、子域授权
  3. 重新安装mysql5.7.21_linux 安装mysql 5.7.21详解以及安装过程中所遇问题解决
  4. 2019全球AI人才报告发布:AI专家仅3.6万
  5. 百度北京一面2016-3-18
  6. Java抓取淘宝/天猫商品详情
  7. prim算法 求最小生成树
  8. 【华为云技术分享】盘点物联网常用开发板
  9. 小菜找实习——阿里3月20日笔试第二题
  10. java目录删除_java删除文件及目录
  11. Java基础———第一弹
  12. 栅栏密码--Python解密脚本
  13. 基于Unity的A星算法实现
  14. 修改服务器电脑mac地址,修改服务器电脑mac地址
  15. studio 3T 使用
  16. 利用IPv6看清晰流畅的网络电视
  17. Origin 画图——简单的柱状图画法
  18. matlab 直接逆滤波,图像复原之直接逆滤波
  19. 千万级 PV是什么意思?
  20. Jib快速打包Docker镜像

热门文章

  1. linux电子设计软件,集成电路eda软件
  2. ubuntu18.04 更新软件源(华为开源镜像源)
  3. OpenCV-Python 图像平滑处理1:卷积函数filter2D详解及用于均值滤波的案例
  4. 游戏感:虚拟感觉的游戏设计师指南——译序和引言
  5. SpringCloud Feign重试详解
  6. 艾永亮:创新引领,超级产品开创企业未来发展的道路
  7. Python判断是否构成三角形,求三角形面积
  8. 分页查询bugannot create inner bean ‘com.github.pagehelper.PageInterceptor#569cfc36‘
  9. 14. Python 与数据库那点事儿,滚雪球学 Python
  10. 美云智数孔凡实:工业软件“突围战”——强化核心技术+渠道共赢生态丨数据猿专访...