2009-09-28 7 views
38

Comprendo che la differenza tra le funzioni printf, fprintf, sprintf e le funzioni vprintf, vfprintf, vsprintf ecc. Ha a che fare con il modo in cui trattano gli argomenti della funzione. Ma in che modo specificamente? C'è davvero qualche ragione per usare l'uno sull'altro? Dovrei semplicemente usare sempre printf in quanto è una cosa più comune da vedere in C, oppure esiste un motivo legittimo per scegliere vprintf?Qual è la differenza tra le famiglie di funzioni printf e vprintf e quando dovrei usare l'una sull'altra?

risposta

59

printf() e gli amici sono per uso normale. vprintf() e gli amici sono per quando si desidera scrivere la propria funzione printf() -like. Dire che si desidera scrivere una funzione per stampare gli errori:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    // what here? 
    va_end(args); 
    return result; 
} 

Si noterà che non si può passare a argsprintf(), dal momento che printf() prende molti argomenti, piuttosto che uno va_list argomento. Le vprintf() funzioni, tuttavia, fanno prendere un argomento va_list invece di un numero variabile di argomenti, ecco la versione completa:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    fputs("Error: ", stderr); 
    result = vfprintf(stderr, fmt, args); 
    va_end(args); 
    return result; 
} 
+1

Naturalmente, poi si desidera una funzione di 'mettere in guardia()', simile 'error()' ma stampa "Warning:" invece, quindi crei la tua funzione _own_ 'vprintf()': int verror (char * prefisso, char * fmt, va_list args); 'e have' error() ' chiamalo con "Error:" e "warn()" chiamalo con "Warning:" ma è tutto semantico. –

+0

tempo per conoscere le funzioni variadiche! Questa risposta ha chiarito le cose, grazie. –

13

Non si desidera utilizzare direttamente vprintf(), ma è incredibilmente utile quando è necessario ad es. avvolgere printf(). In questi casi, definirai la funzione di primo livello con argomenti variabili (...). Quindi li raccoglierai in un va_list, eseguirai l'elaborazione e infine chiami il numero vprintf() sullo va_list per fare in modo che la stampa si verifichi.

Problemi correlati