snprintf

参考猪哥博主的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值