【老生常谈】谈谈C语言中如何实现的获取可变参数列表的功能

在C语言中,是通过下面这三个函数来完成对可变参数列表值的读取的。

  • va_start(ap,fmt);
  • vsprintf(info_buf,fmt,ap);
  • va_end(ap);

使用下面的代码来演示一下。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

int TestFunc(int Flag,const char *fmt,...)
{
	va_list ap;
	char buffer[4096]="";
	
	va_start(ap,fmt);
	vsprintf(buffer,fmt,ap);
	va_end(ap);

	printf("buffer is %s\n",buffer);
	return 0;
}

int main(int argc,char *argv[])
{
	int flag=2;
	int age=25,weight=80;
         char *name="xiaoming";
	TestFunc(flag,"The new student name is [%s],age is [%d],weight is [%d]kg.",name,age,weight);
	getch();
	return 0;
}

运行之后,会发现buffer的内容已经是完整、完善的了。

分析下 vsprintf(buffer,fmt,ap)做了什么工作。

简单的说,就是通过解析fmt串,来读取可变参数列表的信息。

每当遇到%s等格式化符号的时候,就会去找对应的参数;如果是其他字符,就继续读下一个。

而可变的参数列表呢,是从右向左依次放入栈中的。va_start()函数应该是确定最后一个参数的栈地址。

其中,fmt也是有长度限制的,貌似是0x804,转换成十进制是 2052个字节,超出就会报错。

备注:

    1.在使用可变参数列表解析的时候,一定要注意读取的%c格式要与后面的参数类型一致。否则,会造成读参数的内存访问越界等问题。

    2.如果所打印的变量是通过宏定义实现的,比如#define FLAG 1 那么打印这个FLAG的时候该怎么正确的打印出1呢?这里需要强制转换为自己需要的类型进行打印了,应该为 printf("FLAG IS %d",(int)FLAG);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值