InicioApuntes Y MonografiasFunciones con número variable de argumentos


Qué tal de nuevo amigos de Taringa! Hoy vengo a mostrarles como escribir funciones que reciben un número variable de argumentos en C; un buen ejemplo de lo anterior es la función printf.


printf y scanf

Las funciones de la biblioteca estándar de C printf y scanf son un buen ejemplo de funciones que reciben un número variable de argumentos. Explicaremos un poco como es que funciona esto en la función printf.

A la función printf siempre se le debe de pasar un argumento (si o si) que es la cadena de formato.

printf( "El resultado de la operación %f entre %d es %f", x, y, z );

La cadena de formato le informa a printf cuantos argumentos extras recibirá y de que tipo es cada uno. En el ejemplo anterior, la función sabe que recibirá 3 argumentos extras, que el primero es float, el segundo integer y el tercero nuevamente float.


stdarg.h

Para la escritura de funciones o procedimientos que reciban un número variable de argumentos necesitaremos incluir el archivo de cabecera stdarg en el cual se encuentran las macros necesarias para la escritura de este tipo de funciones.

  • va_list, un tipo de dato apuntador
  • va_start(), una macro usada para inicializar la lista de argumentos
  • va_arg(), una macro usada para recuperar cada argumento, en turno, de la lista de variables
  • va_end(), una macro usada para limpieza cuando han sido recuperados todos los argumentos

Cuando se declara una función que toma una lista variable de argumentos primero se listan los parámetros fijos, es decir, aquellos que siempre están presentes (debe haber por lo menos un parámetro fijo). Luego se incluyen puntos suspensivos "..." (como si fuera otro parámetro) al final de la lista de parámetros.

Ahora, la función debe de saber cuantos argumentos adicionales debe esperar y de que tipo es cada uno. Para solucionar lo anterior se puede indicar el número de argumentos adicionales a recibir en el primer argumento (el fijo), aunque esto solo nos valdría si todos los argumentos son del mismo tipo. ¿Y qué pasa si los argumentos adicionales pueden ser de distintos tipos? Se puede recurrir a una solución similar a la usada por printf, la cual debe de ser implementada por el programador

Ahora veamos como recuperar los argumentos adicionales dentro de la función (para su uso claro esta). Primero se declara una variable de tipo va_list, en el ejemplo (que se encuentra más abajo) se usa como identificador "arg_ptr".

Segundo, se llama a la macro va_start() pasándole como argumentos la variable de tipo va_list y el nombre del último argumento fijo (en el ejemplo 'n').

Tercero, se recupera cada argumento llamando a la macro va_arg() la cual recibe como argumentos el tipo de dato va_list, en nuestro ejemplo "arg_ptr" (que ya apunta al primer argumento adicional), y el tipo de dato a recuperar. Cada vez que se llama a la macro va_arg(), "arg_ptr" termina apuntando al siguiente argumento, por lo cual no hace falta incrementarlo y esto nos permite recuperar los argumentos en el orden listado en la llamada de la función (cuyo nombre en nuestro ejemplo es average). Entonces para recuperar n argumentos hace falta llamar n veces a la macro va_arg().

Cuarto, por último se llama a la macro va_end() pasándole como argumento "arg_ptr"

#include <stdio.h>
#include <stdarg.h>

void average( unsigned int n, ... )
{
    unsigned int i = 0u;
    double sum = 0.0;
    va_list arg_ptr;
    
    va_start( arg_ptr, n );
    
    for( i = 0u; i < n; i++ )
        sum += va_arg( arg_ptr, double );
    
    printf( "The average is %.2lf.n", sum/n );
    
    va_end( arg_ptr );
}

int main( void )
{
    average( 6u, 86.0, 100.0, 84.0, 93.0, 92.0, 83.0 );
    return 0;
}


Bueno, hasta aquí el post de hoy, he omitido un par de cosas para no hacer tan largo el post, pero con lo anterior ya puede escribir sus propias funciones que reciban un número variado de argumentos. Espero que les haya gustado la información. ¡Hasta la próxima!


Datos archivados del Taringa! original
51puntos
179visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
3visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

a
acipriani68🇦🇷
Usuario
Puntos0
Posts4
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.