首页 > 技术知识 > 正文

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 审核编辑 黄昊宇

猜你喜欢