参考猪哥博主的Guide写了点测试代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char buffer[1000] = {0};
uint32_t n = 0;
uint32_t count = 0;
uint32_t hex_data = 0xAABB;
uint32_t int_data = 5678;
float float_data = 12.21;
n += snprintf(&buffer[n], 10, "hex:%x,", hex_data);
n += snprintf(&buffer[n], 10, "int:%d,", int_data);
n += snprintf(&buffer[n], 16, "float:%f,", float_data);
printf("n=%d, log:%s\r\n",n,buffer);
//syslog();
return 0;
}
n=34, log:hex:aabb,int:5678,float:12.210000
这4个函数在一些软件代码中经常出现,他们的功能是C中用于格式化输出功能,所谓“格式化”可以理解为“转换”,也可以理解为“筛选”。我们先逐个分析这4个函数。
sprintf
函数原型:
int sprintf(char *str, const char *format, ...);
参数:str -- 字符串数组指针,该数组用于存储格式化后的C字符串。
format -- 格式化模式参数
返回值:成功则返回写入的字符总是,不包括追加的那个'\0', 失败,则返回负数。
这个我们用的比较多,简单的说,该函数可以将 各种类型的整数、字符串、浮点数等等,转换成一个字符串,存放在str指向的内存区域。
实例:
#include <stdio.h>
int main()
{
char str[100];
int a = 100;
sprintf(str, "a value is:%d", a);
printf("%s", str);
return 0;
}
运行结果如下:
snprintf
该函数相比sprintf,名字中多了一个’n’,这里的’n’可以理解为num,对应要格式化的字节数。
函数原型:
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:
#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;
}
运行结果:
实例2:
#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;
}
运行结果:
vsprintf
该函数相比sprintf多了一个’v’, 这里的v可以理解为 var ist,也就是使用参数列表格式化输出到字符串中。
函数原型:
int vsprintf(char *str, const char *format, va_list arg);
参数:str -- 目标字符串。
format -- 格式化模式
arg -- 可变参数列表对象,应呗<stdarg>中定义的va_start 宏初始化。
返回值:
如果成功,则返回写入的字符总数,否则返回一个负值。
实例:
#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;
}
运行结果:
vsnprintf
该函数比较 snprintf,多了1个"v",这里的 v可以理解为 var_list,也就是可变参数列表。其他使用类似。
函数原型:
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
参数:str -- 目标字符串。
size -- 最大格式化的字符长度。
format -- 格式化模式
arg -- 可变参数列表对象,应呗<stdarg>中定义的va_start 宏初始化。
参数
小结
1、名字中包含’n’的限制了格式化输出的最大字节数,这样有一个好处,加了一道保险,就是防止了内存溢出。
2、名字中包含‘v’的,表示支持可变参数列表。
————————————————
版权声明:本文为CSDN博主「猪哥-嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012351051/article/details/106414950