llame a printf usando va_list

 void TestPrint (formato char *, ...)
 {
     va_list argList;

     va_start (argList, formato);
     printf (formato, argList);
     va_end (argList);
 }


 int main ()
 {
     TestPrint ("Prueba de impresión% s% d \ n", "cadena", 55);
     return 0;
 }

Necesito obtener:

Test print string 55 

En realidad, obtengo basura. ¿Qué hay de malo en este código?

Use vprintf() lugar.

En lugar de printf, te recomiendo que pruebes vprintf en su lugar, que fue creado para este propósito específico:

 #include  #include  #include  void errmsg( const char* format, ... ) { va_list arglist; printf( "Error: " ); va_start( arglist, format ); vprintf( format, arglist ); va_end( arglist ); } int main( void ) { errmsg( "%s %d %s", "Failed", 100, "times" ); return EXIT_SUCCESS; } 

Fuente: http://www.qnx.com/developers/docs/6.5.0/index.jsp?topic=/com.qnx.doc.neutrino_lib_ref/v/vprintf.html

Como otros ya han señalado: en este caso, debe usar vprintf en vprintf lugar.

Pero si realmente desea ajustar el printf o si desea ajustar una función que no tiene una versión v... puede hacerlo en GCC utilizando la función __builtin_apply no estándar:

 int myfunction(char *fmt, ...) { void *arg = __builtin_apply_args(); void *ret = __builtin_apply((void*)printf, arg, 100); __builtin_return(ret); } 

El último argumento para __builtin_apply es el máximo. tamaño total de los argumentos en bytes. Asegúrese de usar un valor aquí que sea lo suficientemente grande.

Esta no es la forma de usar printf() . Si desea usar va_lists , use vprintf() lugar. Mire aquí la referencia.