2010-07-09 7 views
9

J'essaie de formater certaines instructions printf pour permettre des niveaux d'indentation arbitraires. Idéalement, je veux la sortie suivante où "One", "Deux", etc sont des espaces réservés pour les messages de journal de longueur variable.Espace de longueur variable en utilisant printf

One 
Two 
    Three 
Two 
One 

Je travaille sur l'espacement de longueur variable requis pour l'indentation, et je sais que je peux faire ce qui suit:

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

mais je me demande s'il y a un moyen de le faire sans la deuxième chaîne vide arg.

Répondre

16

Vous pouvez tout simplement passer comme paramètre ce que vous voulez Edition:

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

Bonne suggestion, mais la chaîne de sortie est également de longueur variable: printf ("% * s% d,% d,% d,% s, CONSTANT CHARS,% p \ n", indent_level, "",. ..); Il est difficile de déterminer la longueur de cette chaîne sans utiliser de tampon intermédiaire. – bvanvugt

+0

Il vous suffit de connaître la longueur du premier paramètre - par ex. vous pouvez utiliser printf ("% * d,% d, ...", indent_level, param1, ...) – adamk

+0

Je vois pour la première fois ce type d'utilisation de printf, pouvez-vous expliquer pourquoi vous utilisez indent_level + strlen (mystr)? –

1

Impossible d'écrire un commentaire pour une raison quelconque, l'affichage de manière séparée un nécro-réponse.

>> « Bien sûr, si le premier paramètre est de longueur variable, alors cela ne fonctionnera pas pour vous »

> Ouais, c'est le cas; il doit être capable de gérer une valeur numérique comme premier paramètre.

Vous pouvez utiliser une chaîne de fringue

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

afin de mettre en retrait décimaux de longueur variable. Un peu maladroit, mais ça marche.

Questions connexes