建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

ttking

发帖: 364粉丝: 21

发消息 + 关注

发表于2020年07月31日 19:23:36 842 3
直达本楼层的链接
楼主
显示全部楼层
[技术干货] sprintf、snprintf、vsprintf、vsnprintf格式化函数分析

转自 猪哥-嵌入式 原文链接:https://blog.csdn.net/u012351051/article/details/106414950 >这4个函数在一些软件代码中经常出现,他们的功能是C中用于格式化输出功能,所谓“格式化”可以理解为“转换”,也可以理解为“筛选”。我们先逐个分析这4个函数。 ## snprintf 该函数相比sprintf,名字中多了一个’n’,这里的’n’可以理解为num,对应要格式化的字节数。 函数原型: ``` int sprintf(char *str, const char *format, ...); 参数:str -- 字符串数组指针,该数组用于存储格式化后的C字符串。 format -- 格式化模式参数 返回值:成功则返回写入的字符总是,不包括追加的那个'\0', 失败,则返回负数。 ``` 这个我们用的比较多,简单的说,该函数可以将 各种类型的整数、字符串、浮点数等等,转换成一个字符串,存放在str指向的内存区域。 实例: ```c #include <stdio.h> int main() { char str[100]; int a = 100; sprintf(str, "a value is:%d", a); printf("%s", str); return 0; } ``` 运行结果如下: ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202007/31/191847i92olz2mnazuhkaa.png) ## snprintf 该函数相比sprintf,名字中多了一个’n’,这里的’n’可以理解为num,对应要格式化的字节数。 函数原型: ```c int snprintf(char *str, size_t size, const char *format, ...); 参数: str -- 目标字符串。 size -- 拷贝的字节数(bytes). format -- 格式化参数 ... -- 可变参数。 返回值: (1)如果格式化后的字符串长度小于等于size,则会把字符串全部拷贝到str中, 并且给其后添加一个字符串结束符'\0'. (2) 如果格式化后的字符串长度大于size,则超过size的部分会被截断,只将其中 的(size - 1)个字符赋值到str中,并且添加字符串结束符'\0',返回值为-1 ``` 实例1: ```c #include <stdio.h> int main() { int len; char str[100]; char *s = "1234567890"; len = snprintf(str, 100, "%s\n", s); printf("str:%s\n count:%d\n", str, len); return 0; } ``` 运行结果: ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202007/31/191936wpgiacdb80tfz3xa.png) 实例2: ```c #include <stdio.h> int main() { int len; char str[100]; char *s = "1234567890"; len = snprintf(str, 6, "%s\n", s); printf("str:%s\ncount:%d\n", str, len); return 0; } ``` 运行结果: ``` str:123456 count:-1 ``` ## vsprintf 该函数相比sprintf多了一个’v’, 这里的v可以理解为 var ist,也就是使用参数列表格式化输出到字符串中。 函数原型: ```c int vsprintf(char *str, const char *format, va_list arg); 参数:str -- 目标字符串。 format -- 格式化模式 arg -- 可变参数列表对象,应呗<stdarg>中定义的va_start 宏初始化。 返回值: 如果成功,则返回写入的字符总数,否则返回一个负值。 ``` 实例: ```C #include <stdio.h> #include <stdarg.h> static char str[100]; int vsprintf_test(char *format, ...) { va_list aptr; int ret; va_start(aptr, format); ret = vsprintf(str, format, aptr); va_end(aptr); return ret; } int main() { int i = 5; float f = 66.6; char *s = "abcdefgf"; int len; len = vsprintf_test("%d %f %s", i, f, s); printf("%s\nlen:%d", str, len); return 0; } ``` 运行结果: ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202007/31/192222eyn8vremaagiesyq.png) ## vsnprintf 该函数比较 snprintf,多了1个"v",这里的 v可以理解为 var_list,也就是可变参数列表。其他使用类似。 函数原型: ```c int vsnprintf(char *str, size_t size, const char *format, va_list ap); 参数:str -- 目标字符串。 size -- 最大格式化的字符长度。 format -- 格式化模式 arg -- 可变参数列表对象,应呗<stdarg>中定义的va_start 宏初始化。 参数 ``` 小结 1、名字中包含’n’的限制了格式化输出的最大字节数,这样有一个好处,加了一道保险,就是防止了内存溢出。 2、名字中包含‘v’的,表示支持可变参数列表。
举报
分享

分享文章到朋友圈

分享文章到微博

andyleung

发帖: 965粉丝: 79

发消息 + 关注

发表于2020年08月05日 20:12:11
直达本楼层的链接
沙发
显示全部楼层

谢谢分享

点赞 评论 引用 举报

Tianyi_Li

发帖: 385粉丝: 197

发消息 + 关注

发表于2020年08月11日 07:23:15
直达本楼层的链接
板凳
显示全部楼层

Thanks.

点赞 评论 引用 举报

柠檬PH=2

发帖: 361粉丝: 44

发消息 + 关注

发表于2020年08月19日 19:41:56
直达本楼层的链接
地板
显示全部楼层

感谢分享,辛苦,赞

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册