va_strart&va_end&va_arg&vsprintf可变参函数基本解释及使用

一、函数介绍

/******************头文件*********************/
#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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值