Librería stdarg.h
Permite la definición de funciones con una lista de argumentos variables, es decir una función en donde no se conocen la cantidad ni el tipo de argumento que recibirán.
Por ejemplo:
Se desea sumar varios datos diferentes, el número de ellos varía cada vez que se invoca. Así:
sumar (3, 27, 30, 50);
O se define una función que imprima los agumentos que se le envían.
int a, float b; ... a=3; b=8.75; imprime ("a=%d b=%f\n", a, b); int mensaje[] = "Hola"; imprime ("Mensaje=%s\n", mensaje);
Prototipos:
int sumar (int NumDat, ...);void imprime (char *formato, ...);
... indica que el número y tipo de Argumentos puede variar.
Para definir este tipo de funciones, se debe utilizar la librería stdarg.h. Esta librería define un tipo de dato llamado va_list y tres macros: va_start, va_arg y va_end.
va_list: Se emplea para definir una variable que apunta a la lista de argumentos.
va_start: Tiene la siguiente forma:
va_start (PuntArg, UltArg);
Esta macro inicializa la variable PuntArg (de tipo va_list) de modo que apunte a la lista de argumentos variables. UltArg es el último argumentos con nombre de la función antes de los puntos (...).
Es obligatorio que exista por lo menos un argumento con nombre (int NumArg en Suma, char *formato en Imprime). Esta variable es usada como punto de referencia para ubicar la lista de argumentos.
va_arg: Tiene la siguiente forma:
va_arg (PuntArg, Type);
Esta macro se expande en una expresión que devuelve un valor del tipo indicado por el argumento type, este resultado es el valor del argumento apuntado por PuntArg.
Finalmente PuntArg apuntará al siguiente Argumento.
va_end: Cuya forma es:
va_end (PuntArg);
Ayuda a la función creada a tener un retorno normal, realizando una labor de "limpieza" (descargando los valores de la pila por ejemplo). Debe ser utilizada luego de haber utilizado todos los argumentos.
Luego:
#include <iostream.h> #include <stdarg.h>
int sum(int NumArg, ...);
void main(void) { cout << "Total = " << sum(4, 1,2,3,4) << endl; cout << "Otro total = " << sum(3, 27,34,55) << endl; }
int sum(int NumArg, ...) { int total = 0,i; va_list PuntArg; int arg;
va_start(PuntArg, &NumArg);
for (i=0;i<NumArg; i++) { arg = va_arg(PuntArg,int); total += arg; }
va_end(PuntArg); return total; }
#include <iostream.h> #include <stdio.h> #include <stdarg.h>
void imprime(char *formato, ...); void main (void) { int a=3; int b=8; char mens[]="Hola";
imprime("a= %d b= %d", a,b); cout << endl; imprime("Mensaje %s", mens); cout << endl; }
void imprime(char *formato, ...) { va_list PArg; char *c, *Texto; int Entero;
va_start(PArg,formato); for (c=formato; *c!='\0'; c++) { if (*c!='%') { putchar(*c); continue; } switch(*++c) { case 'd' : Entero = va_arg(PArg, int); cout << Entero; break; case 's' : Texto = va_arg(PArg, char*); cout << Texto; break; default : putchar(*c); } va_end(PArg); } }
Sin usar la librería stdarg:
#include <iostream.h>
int sum(int NumArg, ...);
void main(void) { cout << "Total = " << sum(4, 1,2,3,4) << endl; cout << "Otro total = " << sum(3, 27,34,55) << endl; }
int sum(int NumArg, ...) { int total = 0,i; int * PuntArg;
PuntArg = &NumArg;
for (i=0;i<NumArg; i++) { PuntArg++; total += *PuntArg; }
return total; }
#include <iostream.h> #include <stdio.h> #include <conio.h>
void imprime(char *formato, ...);
void main (void) { int a=3; int b=8; char mens[]="Hola";
clrscr(); imprime("a= %d b= %d", a,b); imprime("Mensaje %s", mens); }
void imprime(char *formato, ...) { void *PArg; char *c, *Texto; int Entero; double Real;
PArg = &formato; ((char **)PArg)++;
for (c=formato; *c!='\0'; c++) { if (*c!='%') { putchar(*c); continue; } switch(*++c) { case 'd' : Entero = *((int *)PArg)++; cout << Entero; break; case 's' : Texto = *((char **)PArg)++; cout << Texto; break; default : putchar(*c); } } }
![]() |
![]() ![]() |