chiama printf usando va_list

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

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


 int main ()
 {
     TestPrint ("Stampa di prova% s% d \ n", "stringa", 55);
     ritorno 0;
 }

Ho bisogno di ottenere:

Test print string 55 

In realtà, ottengo l’output spazzatura. Cosa c’è di sbagliato in questo codice?

Usa invece vprintf() .

Invece di printf, ti consiglio di provare invece vprintf, che è stato creato per questo scopo specifico:

 #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; } 

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

Come altri hanno già sottolineato: in questo caso dovresti usare invece vprintf .

Ma se vuoi davvero avvolgere printf , o vuoi racchiudere una funzione che non ha una versione v... , puoi farlo in GCC usando la funzione __builtin_apply non standard:

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

L’ultimo argomento per __builtin_apply è il massimo. dimensione totale degli argomenti in byte. Assicurati di utilizzare qui un valore sufficientemente grande.

Non è così che usi printf() . Se si desidera utilizzare va_lists , utilizzare invece vprintf() . Guarda qui riferimento.