C语言可变形参是什么

描述

C语言可变形参

  C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。

1.可变形参相关函数

#include 
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

  va_start完成ap指针初始化,以供va_arg和va_end后续使用,该函数必须先调用。参数last是变量参数列表前最后一个参数的名称;
 va_arg实现下一个参数的类型和值的获取。参数ap是由va_start初始化的参数列表。对va_arg()的每次调用都会修改ap,以便获取下一个参数。参数类型type是一个指定的数据类型。
 va_end将ap指向NULL。
 va_copy将参数列表src复制到dest中,该函数在c99才有定义。

2.可变形参模仿printf函数

#include 
#include 
void my_printf(const char *fmt,...);
int main()
{
	my_printf("%s\n","123456");
	my_printf("%d %%\n",55);
	my_printf("%f\n",789.56);
	my_printf("%c\n",'c');
	my_printf("%ld,%lf\n",1234567890123,45.789625);
}
void my_printf(const char *fmt,...)
{
	va_list ap;
	va_start(ap,fmt);//ap=fmt
	char c,*s;
	int d;
	float f;
	long l;
	double b;
	while(*fmt)
	{
		if(*fmt!='%')
		{
			putchar(*fmt);//输出%前所有字符
		}
		else 
		{
			fmt++;//跳过%
			switch(*fmt)
			{
				case 'c'://字符
					c=(char )va_arg(ap,int);//字符存储时按int空间处理
					fprintf(stdout,"%c",c);
					break;
				case 'd'://整数
					d=va_arg(ap,int);
					fprintf(stdout,"%d",d);
					break;
				case 'f'://浮点数
					f=(float)va_arg(ap,double);//浮点数据处理时按double处理
					fprintf(stdout,"%f",f);
					break;
				case '%'://%%
					putchar(*fmt);
					break;
				case 's'://字符串
					s=va_arg(ap,char *);
					fprintf(stdout,"%s",s);
					break;
				case 'l':
					fmt++;
					if(*fmt=='d')//长整形%ld
					{
						l=va_arg(ap,long);
						fprintf(stdout,"%ld",l);
					}
					else if(*fmt=='f')//双精度浮点型%lf
					{
						b=va_arg(ap,double);
						fprintf(stdout,"%lf",b);
					}
					break;
			}
		}
		fmt++;
	}
	va_end(ap);//ap=NULL
}

  运行效果:

[wbyq@wbyq 0414work]$ gcc main.c 
[wbyq@wbyq 0414work]$ ./a.out 
123456
55 %
789.559998
c
1234567890123,45.789625

审核编辑 黄昊宇

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分