Impression du pavé gauche avec espaces

114

Comment puis-je remplir une chaîne avec des espaces à gauche lors de l'utilisation de printf?

Par exemple, je veux imprimer "Bonjour" avec 40 espaces le précédant.

De plus, la chaîne que je souhaite imprimer se compose de plusieurs lignes. Dois-je imprimer chaque ligne séparément?

EDIT: Juste pour être clair, je veux exactement 40 espaces imprimés avant chaque ligne.

titane
la source

Réponses:

125

Si vous souhaitez que le mot «Bonjour» s'imprime dans une colonne de 40 caractères de large, avec des espaces remplissant la gauche, utilisez ce qui suit.

char *ptr = "Hello";
printf("%40s\n", ptr);

Cela vous donnera 35 espaces, puis le mot "Bonjour". C'est ainsi que vous formatez les choses lorsque vous savez quelle est la largeur de la colonne, mais que les données changent (enfin, c'est une façon de le faire).

Si vous savez que vous voulez exactement 40 espaces puis du texte, enregistrez simplement les 40 espaces dans une constante et imprimez-les. Si vous avez besoin d'imprimer plusieurs lignes, utilisez plusieurs printfinstructions comme celle ci-dessus ou faites-le en boucle, en changeant la valeur de ptrchaque fois.

Bill le lézard
la source
3
je ne sais pas trop sur les drapeaux de format. mais je soupçonne printf ("% 40s% s \ n", "", ptr); peut également être utilisé pour le garnir de 40 espaces?
Johannes Schaub - litb
Oui, cela vous donnerait toujours 40 espaces avant le contenu du pointeur. C'est une bonne solution, mais si vous devez le faire beaucoup, je pense qu'une constante avec 40 espaces serait plus rapide. Je ne sais pas si le compilateur est capable d'optimiser les formats printf.
Bill the Lizard
38
De plus, si vous avez une variable int 'n' qui contient le nombre d'espaces à inclure, vous pouvez utiliser: printf ("% * s% s \ n", n, "", ptr); pour obtenir un nombre variable d'espaces.
Jonathan Leffler
Et, pour aborder la dernière partie du Q: oui, si vous voulez que chaque ligne des données soit imprimée avec 40 espaces de début, alors vous devez segmenter les données afin que chaque ligne soit imprimée séparément.
Jonathan Leffler
4
@Jonathan Leffler: bien sûr, le compilateur peut optimiser les formats printf. Par exemple, GCC optimise printf ("% s \ n", foo) et le remplace par put (foo).
sam hocevar
73

J'utilise cette fonction pour indenter ma sortie (par exemple pour imprimer une arborescence). Le indentest le nombre d'espaces avant la chaîne.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}
jk_
la source
7
J'aime votre utilisation de la concaténation littérale de chaîne pour séparer l'indentation du reste du format printf. Une suggestion: utilisez une chaîne vide au lieu d'un seul espace pour la chaîne de retrait. De cette façon, indent == 0 fonctionnera comme prévu. (ie, printf(..., indent, "", ...))
ɲeuroburɳ
Notez que Ray Hulha a supprimé la concaténation littérale de chaîne, évidemment afin de résoudre un "problème de compilation".
mwfearnley
42
int space = 40;
printf("%*s", space, "Hello");

Cette instruction réservera une ligne de 40 caractères, imprimera la chaîne à la fin de la ligne (en supprimant les espaces supplémentaires de telle sorte que la longueur totale de la ligne soit constante à 40). La même chose peut être utilisée pour les caractères et les entiers comme suit:

printf("%*d", space, 10);
printf("%*c", space, 'x');

Cette méthode utilisant un paramètre pour déterminer les espaces est utile lorsqu'un nombre variable d'espaces est requis. Ces instructions fonctionneront toujours avec des littéraux entiers comme suit:

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

J'espère que cela aidera quelqu'un comme moi à l'avenir.

Recevoir Foc
la source
J'ai eu error: empty character constantpour ''. Ne devrait-il pas l'être ' '?
Jin Kwon
Oui, ça devrait.
shjeff
@JinKwon n'importe quel personnage, comme cela "Hello"pourrait être n'importe quoi, il aurait dû utiliser un exemple
Joe Pelletier
18

Si vous voulez exactement 40 espaces avant la chaîne, vous devez simplement faire:

printf("                                        %s\n", myStr );

Si c'est trop sale, vous pouvez le faire (mais ce sera plus lent que de taper manuellement les 40 espaces): printf("%40s%s", "", myStr );

Si vous voulez que la chaîne soit alignée à la colonne 40 (c'est-à-dire, ayez jusqu'à 39 espaces en cours de telle sorte que le caractère le plus à droite soit dans la colonne 40), procédez comme suit: printf("%40s", myStr);

Vous pouvez également mettre "jusqu'à" 40 espaces APRÈS la chaîne en faisant: printf("%-40s", myStr);

Caisse à savon
la source
2
comme ce commentaire pour les espaces après la chaîne
oneat