2010-07-09 19 views
9

Sto provando a formattare alcune istruzioni printf per consentire livelli arbitrari di indentazione. Idealmente voglio il seguente output dove "One", "Two", ecc. Sono segnaposti per i messaggi di registro a lunghezza variabile.Spazio di lunghezza variabile con printf

One 
Two 
    Three 
Two 
One 

sto lavorando sulla distanza lunghezza variabile necessaria per il rientro, e so che posso fare quanto segue:

printf("%*s", indent_level, ""); 

ma mi chiedo se c'è un modo per farlo senza la seconda stringa vuota arg.

risposta

16

si può semplicemente passare come parametro ciò che si desidera per stampare:

printf("%*s", indent_level + strlen(mystr), mystr); 
+0

Buon suggerimento, ma la stringa di output è anch'essa di lunghezza variabile: printf ("% * s% d,% d,% d,% s, CARICA COSTANTE,% p \ n", indent_level, "",. ..); È difficile determinare la lunghezza di quella stringa senza utilizzare un buffer intermedio. – bvanvugt

+0

Devi solo conoscere la lunghezza del primo parametro - ad es. potresti usare printf ("% * d,% d, ...", indent_level, param1, ...) – adamk

+0

Ho la prima volta che uso quel tipo di printf, puoi spiegare perché stai usando indent_level + strlen (mystr)? –

1

Impossibile scrivere un commento per qualche ragione, così la pubblicazione come un necro-risposta separata.

>> "Certo, se il primo parametro è anche a lunghezza variabile, quindi questo non funzionerà per voi"

> Sì, questo è il caso; deve essere in grado di gestire un valore numerico come primo parametro.

È possibile utilizzare una stringa vero disastro

printf ("%*s%d", indent_level, "", decimal); 

al fine di rientrare decimali a lunghezza variabile. Un po 'goffo, ma funziona.