pasar muchos argumentos a una función de C

¿Cómo puedo pasar muchos argumentos a una función de C? Suponiendo que tengo esta función:

void f(int n, char* a, char* b, ...) 

Quiero un número indefinido de argumentos char *. ¿Como lo puedo hacer?

Lo que necesita se llama número variable de funciones de argumento, puede leer de: 9.9. Números variables de argumentos un buen tutorial y ensayo.

Una breve teoría en cuatro puntos te ayudará a entender mi código:

  1. el archivo de encabezado debe incluirse, su introduce un nuevo tipo, llamado va_list, y tres funciones que operan en objetos de este tipo, llamados va_start, va_arg, and va_end .
  2. va_start: es una macro para establecer arg_ptr al principio de la lista ap de argumentos opcionales
  3. va_arg: no usa este puntero de stack guardado y extrae la cantidad correcta de bytes para el tipo proporcionado
  4. va_end: es una macro para restablecer ap . Una vez recuperados todos los argumentos, va_end restablece el puntero a NULL.

Esta teoría no es suficiente, pero debajo de un ejemplo (como lo solicitó) lo ayudará a comprender el flujo de trabajo básico y los pasos: ( lea el comentario para cada 4 pasos )

 //Step1: Need necessary header file #include  void f(int first, char* a, char* b, ...){ va_list ap; // vlist variable int n; // number char aa, int i; float f; //print fix numbers of arguments printf("\n %d, %s, %s\n", first, a, b); //Step2: To initialize `ap` using right-most argument that is `b` va_start(ap, b); //Step3: Now access vlist `ap` elements using va_arg() n = va_arg(ap, int); //first value in my list gives number of ele in list while(n--){ aa = (char)va_arg(ap, int); // notice type, and typecast i = va_arg(ap, int); f = (float)va_arg(ap, double); printf("\n %c %d %f \n", aa,i, f); } //Step4: Now work done, we should reset pointer to NULL va_end(ap); } int main(){ char* a = "Aoues"; char* b = "Guesmi"; f(2, a, b, 3, 'a', 3, 6.7f, 'b', 5, 5.5f, 'A', 0, 0.1); // ^ this is `n` like count in variable list return 1; } 

Quien lo hace corre:

 ~$ ./a.out 2, Aoues, Guesmi a 3 6.700000 b 5 5.500000 A 0 0.100000 

Una breve explicación de mi código será útil para futuros usuarios:

  1. En realidad, la función es un número fijo de argumentos seguidos por un número variable de argumentos. Y el argumento más a la derecha para funcionar (en la lista de argumentos fijos que es char* b en nuestra función f() ) usa solo para inicializar la lista viable ap .
  2. La función f() primer puño lee un valor n que es 3 ( lea el comentario en main ). En f() , while(n--) ejecuta tres veces y cada vez en un bucle usando la macro va_arg() , recuperamos tres valores.
  3. Si nota que lee primero dos ints luego double , A donde estoy enviando char, int, float ( aviso principal donde llamo f () ). esto se debe a que el auto tipo se promociona en el caso de la lista de argumentos variables (lea en detalle desde arriba lisk)

Ella es un enlace más útil de MSDN: va_arg, va_end, va_start .

( Avísame si necesitas más ayuda con respecto a esto )

Use varargs (busque esto usted mismo, las cosas que usa la persona que llama para leer los stdarg.h está en stdarg.h ).

Tenga en cuenta que no hay forma de que el destinatario determine automáticamente el número de argumentos que realmente se aprobaron. Entonces, por ejemplo, podría ser n , y solo tiene que confiar en la persona que llama para que n tenga la razón.