snprintf总结
一、函数概要
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总结相关推荐
- C库函数:scanf、fscanf、printf、fprintf、sprintf、 snprintf
1. scanf 函数原型 int scanf(const char *format, ...); 功能:从标准输入 stdin 读取格式化输入. 2.fscanf 函数原型 int fscanf( ...
- c++ 缓存和缓冲_【嵌入式C】放弃printf,选择了精简snprintf
1.聊一聊 今晚平安夜,记得一定要吃苹果哦!同时提前祝大家圣诞快乐,Merry Christmas! 是一首超级有氛围感的圣诞歌曲,大伙可以听一听,请相信我的品位! 2.正文部分 对于printf相信 ...
- 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
问题: 函数memcpy(dest, src, sizeof(dest)).strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), ...
- sprintf,sscanf,snprintf
sprintf:将格式化的数据写入字符串,第一个参数是缓冲区buf.成功返回写字符的总数,失败返回一个负数 1.最简单用法: char str[20]; sprintf(str,"%d&qu ...
- 三个打印函数printf()/sprintf()/snprintf()区别
先贴上其函数原型 printf( const char *format, ...) 格式化输出字符串,默认输出到终端-----stdout sprintf(char *dest, const c ...
- C语言函数 snprintf()(发送有限字符截断字符串输出到 str 所指向的字符串)(字符串拼接、截断拼接)
相似函数: C语言sprintf函数(发送格式化输出到 str 所指向的字符串)(format 标签属性)(字符串拼接) 文章目录 描述 声明 参数 返回值 实例 C 标准库 - <stdio. ...
- 各种输出函数的比较(printf/fprintf/sprintf/snprintf/vprintf/vfprintf/vsprintf/vsnprintf)
对于程序猿来说,printf函数可以说是最熟悉的一个工具了.利用它可以将各类调试信息输出到指定的设备(比如串口)中,实现对程序运行状态的掌控和分析.不过,在实际的应用中,相信大家除了printf函数之 ...
- linux c之snprintf()和sprintf()区别
1.snprintf函数 int snprintf(char *str, size_t size, const char *format, ...); 将可变个参数(...)按照format格式化成字 ...
- 关于sprintf和snprintf的比较
#include <stdio.h> #include <string.h>typedef unsigned char uchar;#define BUF_SIZE 10 // ...
- snprintf函数用法
int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...
最新文章
- 【自译】八步成为数据科学家
- DNS区域传送、子域授权
- 重新安装mysql5.7.21_linux 安装mysql 5.7.21详解以及安装过程中所遇问题解决
- 2019全球AI人才报告发布:AI专家仅3.6万
- 百度北京一面2016-3-18
- Java抓取淘宝/天猫商品详情
- prim算法 求最小生成树
- 【华为云技术分享】盘点物联网常用开发板
- 小菜找实习——阿里3月20日笔试第二题
- java目录删除_java删除文件及目录
- Java基础———第一弹
- 栅栏密码--Python解密脚本
- 基于Unity的A星算法实现
- 修改服务器电脑mac地址,修改服务器电脑mac地址
- studio 3T 使用
- 利用IPv6看清晰流畅的网络电视
- Origin 画图——简单的柱状图画法
- matlab 直接逆滤波,图像复原之直接逆滤波
- 千万级 PV是什么意思?
- Jib快速打包Docker镜像
热门文章
- linux电子设计软件,集成电路eda软件
- ubuntu18.04 更新软件源(华为开源镜像源)
- OpenCV-Python 图像平滑处理1:卷积函数filter2D详解及用于均值滤波的案例
- 游戏感:虚拟感觉的游戏设计师指南——译序和引言
- SpringCloud Feign重试详解
- 艾永亮:创新引领,超级产品开创企业未来发展的道路
- Python判断是否构成三角形,求三角形面积
- 分页查询bugannot create inner bean ‘com.github.pagehelper.PageInterceptor#569cfc36‘
- 14. Python 与数据库那点事儿,滚雪球学 Python
- 美云智数孔凡实:工业软件“突围战”——强化核心技术+渠道共赢生态丨数据猿专访...