C: Passer un nombre variable d’arguments d’une fonction à une autre

Alors, voici un petit problème que je rencontre actuellement -> J’essaie d’écrire une fonction qui acceptera un message char * et un nombre variable d’arguments. Ma fonction modifiera un peu le message, puis il appellera printf avec le message et les parameters donnés. Essentiellement, j’essaie d’écrire quelque chose comme ça:

void modifyAndPrintMessage(char* message,...){ char* newMessage; //copy message. //Here I'm modifying the newMessage to be printed,and then I'd like to print it. //passed args won't be changed in any way. printf(newMessage,...); //Of course, this won't work. Any ideas? fflush(stdout); } 

Alors, tout le monde sait que dois-je faire pour que cela se produise? Je serais très reconnaissant pour toute aide 🙂

    Vous voulez utiliser varargs …

     void modifyAndPrintMessage( char* message, ... ) { // do somehthing custom va_list args; va_start( args, message ); vprintf( newMessage, args ); va_end( args ); } 
     void modifyAndPrintMessage(char* message,...) { char newMessage[1024]; // **Make sure the buffer is large enough** va_list args; va_start(args, message); vsnprintf(newMessage, message, args); printf(newMessage); fflush(stdout); } 

    Utilisez varargs pour accepter un nombre variable de parameters, puis utilisez sprintf pour créer le nouveau message.

    Vous pouvez utiliser va_list partir de stdarg.h ,

    Exemple C: http://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm Exemple C ++: http://www.cprogramming.com/tutorial/lesson17.html .

    Bien sûr, voir la page de manuel: http://linux.die.net/man/3/stdarg

    Exemple de page de manuel pour référence:

     #include  #include  void foo(char *fmt, ...) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch (*fmt++) { case 's': /* ssortingng */ s = va_arg(ap, char *); printf("ssortingng %s\n", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d\n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c\n", c); break; } va_end(ap); } 

    Il y a une bibliothèque qui inclut cette fonctionnalité. Voici un exemple de code de la référence:

     #include  /* va_list, va_start, va_arg, va_end */ int FindMax (int n, ...) { int i,val,largest; va_list vl; va_start(vl,n); largest=va_arg(vl,int); for (i=1;ival)?largest:val; } va_end(vl); return largest; } 

    Les points de suspension sont en réalité un code valide et vous pouvez utiliser l’object va_list pour parsingr un nombre variable de parameters.