对应TCPL137页
类似于printf scanf等函数,C语言提供了变长参数表,它可以读入不限长度的参数并处理
首先看一个简单的demo吧,func函数将读入的字符串输出到屏幕上
#include<stdio.h>
#include<string.h>
#include<stdarg.h>
void func(char* fmt,...)
{
va_list ap;
char *p;
va_start(ap,fmt);
while(1)
{
p=va_arg(ap,char *);
if(strcmp(p,"\0")==0) break;
printf("%s",p);
}
va_end(ap);
}
int main()
{
func("demo","aa","bb","\0");
}
//输出结果 aabb
上面的va_list va_start va_arg va_end
分别是由stdarg.h
定义的三个宏
va_list
用于声明一个变量ap,该变量将依次引用各参数。va_start(ap,fmt)
将ap初始化为指向第一个无名参数的指针,这里必须给一个起点,也就是fmt。而va_arg(ap,char *)
会返回第二个参数格式的指针,并且将ap指向下一个参数。在处理完之后,使用va_end(ap)
来完成清理。
第一个参数是有必要的,它不仅提供了起点,而且还可以通过第一个参数来完成不同的功能。查看一下printf的声明
int printf(char *fmt,...);
你会发现平时我们打的%s %d hello %s
等输出格式都是存放在fmt中,函数读取fmt来按照指定格式处理字符串。