sprintf、snprintf、vsprintf、vsnprintf格式化函数分析

这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’的,表示支持可变参数列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值