2016-06-02 11 views
9

Ich habe einen String-Maske, die etwa wie folgt aussieht:Wie führe ich eine Liste von Argumenten in Funktion mit variabler Anzahl von Parametern?

    +--\ 
        | \ 
        | \ 
       +---|  \ 
       +---|  \ 
+     |  \ 
|\ +---------------------------------+\ 
| \ | %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| |/
|/ +---------------------------------+/ 
+     |  /
       +---| /
       +---| /
        | /
        | /
        +--/ 

ich printf brauchen es - printf(string-mask, param1,param2,param3, etc...), aber Anzahl von Parametern ist eine riesige (real Zeichenkette, die es etwa 40 ist). Gibt es eine Möglichkeit, die manuelle Aufzählung von Parametern zu vermeiden?

P.S. Ich verwende reines C.

P.S.S. Parameter werden in Array gespeichert.

+0

"manuelle Auszählung"? Können Sie das definieren ?, Sie werden wahrscheinlich keine Schleifen umgehen. –

+0

@self 'printf (string-maske, param1, param2, param3, etc ...)' ist eine manuelle Enumeration. – 0x1337

+0

In einer Schleife drucken. – user3386109

Antwort

5

Iterieren Sie das Array (die Zeichenfolge), bis Sie einen Druckspezifizierer drücken. Drucken Sie dann die Zeichenfolge von der Stelle, an die Sie zuvor gegangen sind, einschließlich des Spezifizierers, während Sie ein einzelnes Argument aus dem Wertearray übergeben.

Dies ist eine schnelle und schmutzige Lösung ohne Fehlerprüfung, die davon ausgeht, dass jeder Spezifizierer genau %d ist und es genau param_count von ihnen gibt. Auch die Zeichenfolge muss änderbar sein. Hier

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 

ist die Ausgabe: https://ideone.com/zIBsNj

Verwandte Themen