vsnprintf()函数 & vfprintf()函数
2017年12月10日 10:15:34 记得北海有墓碑 阅读数:4066
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37824129/article/details/78763286
注:带颜色的部分文本是转发者自己加的,仅供参考。
vsnprintf函数
头文件:#include <stdarg.h>
函数原型:int vsnprintf(char *str, size_t size, const char *format, va_list ap);
函数说明:将可变参数格式化输出到一个字符数组
参数:str输出到的数组,size指定大小,防止越界,format格式化参数,ap可变参数列表函数用法
举例:
#include <stdio.h>
#include <stdarg.h>
void test(const char * format, ...);
int main(void)
{
test("%d_%s", 6, "abc");
return 0;
}
void test(const char * format, ...) //此函数的任务时是完成把程序员想输入的n个参数(可能是整形6,字符串"abcd",小数5.6等)
//按照对应的格式化字符的格式(譬如:%d_%s_%f)一次存入到一个字符数组char buff[4069]中
//并将这些字符使用printf("%s\n", buff)打印出来,譬如:6_abcd_5.6,
{
char buf[4069];
va_list list;
va_start(list, format);
vsnprintf(buf, 4069, format, list);
va_end(list);
printf("%s\n", buf);
}
输出结果为:6_abc
vfprintf()函数
头文件:#include <stdarg.h>
函数原型: int vfprintf(FILE *stream, const char *format, va_list arg);
函数说明:fprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘\0’)为止。
C语言printf家族函数的成员:
#include <stdio.h>
int
printf
(
const
char
*format, ...);
//输出到标准输出
int
fprintf
(
FILE
*stream,
const
char
*format, ...);
//输出到文件
int
sprintf
(
char
*str,
const
char
*format, ...);
//输出到字符串str中
int
snprintf(
char
*str,
size_t
size,
const
char
*format, ...);
//按size大小输出到字符串str中
以下函数功能与上面的一一对应相同,只是在函数调用时,把上面的...对应的一个个变量用
va_list
调用所替代。在函数调用前ap要通过
va_start
()宏来动态获取,
不能往里使用va_end(ap)释放前面定义的指针。va_start(list, format)是一个通过定义的变参指针ap和变参前面的固定参数名来获取待输入的第一个变参的地址即调用函数
test("%d_%s", 6, "abc");时第一个变参6在栈中的内存地址,顺便说一下"%d_%s"是变参列表中的前面的一个参数,它对应的函数test定义时void test(const char * format, ...)的const char *format这一项,即三个点...前面的那个参数。vsnprintf()函数的作用是获取程序员调用函数时输入几个变参后(当然变参之间用逗号隔开),将这些变参作为字符存储到一个字符数组buff[]中,函数的返回值就是这些字符的个数(因为vsnprintf返回值是int类型),可以写成int i = vsnprintf();因为此函数中使用了定义的字符数组buff[],所以在函数vsnprintf()中可以使用printf("%s", buff)打印程序员输入的变参的内容(实际上可以叫打印程序员输入的用逗号间隔的所有字符的内容,逗号不会打印出来,这里的函数vsnprintf()的作用有点像va_art(ap, t)的作用:获取第一个变参t的地址对应的内容,然后将指针ap指向下一个变参。)
#include <stdarg.h>
int
vprintf
(
const
char
*format,
va_list
ap);
int
vfprintf
(
FILE
*stream,
const
char
*format,
va_list
ap);
int
vsprintf
(
char
*str,
const
char
*format,
va_list
ap);
int
vsnprintf(
char
*str,
size_t
size,
const
char
*format,
va_list
ap);