一、函数介绍
/******************头文件*********************/
#include <stdarg.h>
/****************变参列表指针类型****************/
va_list //指向变参列表的参数类型,实际是一个字符指针
/**************************************************
* 函数名称: va_start
* 函数入口:
* va_list ap:可变参数列表指针
* last:可变参数前一个参数即:“...”前面的参数
* 函数出口:无
* 函数说明:用于将参数ap指向变参数列表第一个参数
* *************************************************/
void va_start(va_list ap, last);
/**************************************************
* 函数名称: va_arg
* 函数入口:
* va_list ap:可变参数列表指针
* type:获取参数的类型
* 函数出口:
* type:获取参数数据
* 函数说明: 用于按照指定类型获取ap指向变参列表中的参数值,获取成功后将偏移参数列表中下一个位置
* *************************************************/
type va_arg(va_list ap, type);
/**************************************************
* 函数名称: va_end
* 函数入口:
* va_list ap:可变参数列表指针
* 函数出口: 无
* 函数说明:与va_start配套用于释放释放指针,将输入的参数 ap 置为 NULL。
* *************************************************/
void va_end(va_list ap);
/**************************************************
* 函数名称: va_copy
* 函数入口:
* va_list src:源变参指针列表
* 函数出口: va_list dest:目标参数列表指针
* 函数说明:用于将一个变参列表复制到另一变参列表指针。
* *************************************************/
void va_copy(va_list dest, va_list src);
/**************************************************
* 函数名称: vsprintf
* 函数入口:
* str:保存格式化信息
* format:格式化字符串
* ap:可变参数列表变量,指明需要格式的数据
* 函数出口: 无
* 函数说明: 返回已经格式化的字符数,出现错误返回EOF。
* 此函数头文件为:#include <stdio.h>
* *************************************************/
int vsprintf(char *str, const char *format, va_list ap);
二、使用步骤
说明:
读取可变参数的过程其实就是在栈区中,使用指针,遍历栈区中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程,栈区地址是从高到低分配的,由于压栈特性,因此取数据先从栈顶向栈底取(从低地址向高地址)。因此对于处理变参问题上,引入了一个变参列表指针ap,用于指向变参列表首地址。
例程1:测试vsprintf
#include <stdio.h>
#include <stdarg.h>
int user_printf(char *format,...)
{
va_list ap;
char vsbuf[1024]={0};
va_start(ap,format);//第二个参数就是"..."前面的参数format
int len=vsprintf(vsbuf,format,ap);//将变参数内容进行格式化转换
printf("%s",vsbuf);//假设替换为单片机下的发送接口使用可以实现格式化发送
va_end(ap);//释放指针
return len;
}
void main(void)
{
int a[3]={1,2,3};
printf("%d\r\n", user_printf("1234[%d][%d][%d]\r\n",a[0],a[1],a[2]));
}
运行结果:
1234[1][2][3]
15
例程2:测试va_arg
#include <stdio.h>
#include <stdarg.h>
int user_strtets(char *msg,...)
{
va_list ap;
va_start(ap,msg);//第二个参数就是"..."前面的参数format
printf("%s\r\n",va_arg(ap,char *));//获取“...”中第一参数“222”
printf("%s\r\n",va_arg(ap,char *));//获取“...”中第二参数“333”
va_end(ap);//释放指针
}
void main(void)
{
int a[3]={1,2,3};
user_strtets("111","222","333");
}
运行结果:
222
333