Parâmetros de variáveis da linguagem C
A linguagem C permite a definição de uma função com um número variável de parâmetros, que é chamada de função variádica. Tais funções requerem um número fixo de argumentos obrigatórios, seguido por um número variável de argumentos opcionais.
1. Função de correlação de parâmetros deformáveis
#include <stdarg.h>
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 completa a inicialização do ponteiro ap para uso subsequente por va_arg e va_end , esta função deve ser chamada primeiro. O parâmetro last é o nome do último parâmetro antes da lista de parâmetros da variável;
va_arg realiza a aquisição do tipo e valor do próximo parâmetro. O parâmetro ap é a lista de parâmetros inicializada por va_start. Cada chamada para va_arg() modifica ap para obter o próximo argumento. O tipo de tipo de parâmetro é um tipo de dados especificado.
va_end aponta ap para NULL.
va_copy copia a lista de parâmetros src para dest, esta função só é definida em c99.
2. Parâmetros deformáveis imitam a função printf
#include <stdio.h>
#include <stdarg.h>
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
}
resultado em execução:
[wbyq@wbyq 0414work]$ gcc main.c
[wbyq@wbyq 0414work]$ ./a.out
123456
55 %
789.559998
c
1234567890123,45.789625