2012-05-28 20 views
5

Sto cercando di avvolgere printf in un programma C (beh, in realtà _snprintf ma questo esempio è più semplice) e sto avendo problemi a far funzionare gli argomenti delle variabili. Ecco il mio codice:Problemi nel wrapping Printf in programma C

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

void works(void) 
{ 
    printf("%d\n", 100); 
} 

void wrap_printf(const char *fmt, ...) 
{ 
    va_list args; 
    va_start(args, fmt); 
    printf(fmt, args); 
    va_end(args); 
} 

void broken(void) 
{ 
    wrap_printf("%d\n", 100); 
} 

int main(void) 
{ 
    works(); 
    broken(); 
    return 0; 
} 

Ecco la mia uscita:

100 
3668388 

La variabile args sembra buono dopo la chiamata a va_start nel mio codice, ma non appena faccio un passo nel codice C runtime e chiamano va_start il valore sembra scadente. Qualche idea su cosa potrei fare male?

+0

possibile duplicato di [call printf utilizzando va_list] (http://stackoverflow.com/questions/5977326/call-printf-using-va-list) –

risposta

9
va_start(args, fmt); 
vprintf(fmt, args); 
va_end(args); 

è necessario chiamare vprintf invece di printf. Le funzioni v*printf comprendono gli argomenti va_List. Sono sorpreso che tu non abbia ricevuto un avvertimento.

+0

quando si scrive il codice qui su stackoverflow, assicurarsi di utilizzare blocchi di codice appropriati , non citazioni nella tua risposta. –

+0

@ RichardJ.RossIII Grazie :-) Stavo ancora modificando. – cnicutar

+0

Grazie! Nessun avviso diverso da "_snprintf": questa funzione o variabile potrebbe non essere sicura. Prendi in considerazione l'uso di _snprintf_s. – user1421964

5

si sta passando args che è un va_list, ma printf() naturalmente si aspetta argomenti direttamente, non ha modo di sapere che il suo secondo argomento improvvisamente è un va_list.

Si dovrebbe usare vprintf(), la versione di argomento variabile che effettivamente si aspetta un va_list e sa come estrarre i valori da esso.

+1

Tecnicamente, puoi farlo anche con l'assemblaggio .. –