2016-06-02 25 views
9

Ho uno string-maschera che sembra qualcosa di simile:Come passare un elenco di argomenti in funzione con un numero variabile di parametri?

    +--\ 
        | \ 
        | \ 
       +---|  \ 
       +---|  \ 
+     |  \ 
|\ +---------------------------------+\ 
| \ | %d| %d| %d| %d| %d| | \ 
| \| %d| %d| %d| %d| %d| | |\ 
| | %d| %d| %d| %d| %d| | | \ 
|---|         | | \ 
|---|         | |/
| | %d| %d| %d| %d| %d| | |/
| /| %d| %d| %d| %d| %d| | |/ 
|/| %d| %d| %d| %d| %d| |/
|/ +---------------------------------+/ 
+     |  /
       +---| /
       +---| /
        | /
        | /
        +--/ 

ho bisogno di printf esso - printf(string-mask, param1,param2,param3, etc...), ma il numero di parametri è un enorme (nella stringa reale è circa 40). C'è modo di evitare l'enumerazione manuale dei parametri?

P.S. Uso puro C.

P.S.S. i parametri stanno memorizzando in array.

+0

"la conta manuale"? Puoi definirlo? Probabilmente non uscirai da loop. –

+0

@self 'printf (string-mask, param1, param2, param3, etc ...)' è un'enumerazione manuale. – 0x1337

+0

Stampa in loop. – user3386109

risposta

5

Iterare la matrice (la stringa), fino a quando non si preme un identificatore di stampa. Quindi stampa la stringa da cui hai lasciato in precedenza, incluso, l'identificatore, mentre passa un singolo argomento dalla matrice di valori.

Questa è una soluzione rapida e sporca senza controllo errori che presuppone che ogni specificatore sia esattamente %d e che ci siano esattamente param_count di essi. Anche la stringa deve essere modificabile.

const size_t param_count = 30; 
char* first = string; 
char* last = string; 
for(size_t i = 0 ; i < param_count ; i++) 
{ 
    last = strchr(last , '%'); //find the specifier 
    last += 2 ; //skip the specifier 
    const char temp = *last; 
    *last = '\0'; //terminate the 'sub-string' 
    printf(first , param[i]); 
    *last = temp; //restore the 'string' 
    first = last; 
} 
printf(first); //print the remaining string 

Ecco l'output: https://ideone.com/zIBsNj

Problemi correlati