web-dev-qa-db-fra.com

Comment formater des chaînes en utilisant printf () pour obtenir la même longueur dans la sortie?

J'ai deux fonctions, l'une qui produit des messages comme Starting initialization... et un autre qui vérifie les codes de retour et les sorties "Ok", "Warning" ou "Error". Cependant, la sortie produite est de longueur différente:

Starting initialization...Ok.
Checking init scripts...Ok.

Comment puis-je obtenir quelque chose comme ça:

Starting initialization...       Ok.
Checking init scripts...         Ok.
80
psihodelia

Vous pouvez spécifier la largeur des champs de chaîne, par exemple.

printf("%-20s", "initialization...");

et alors tout ce qui est imprimé avec ce champ sera rempli de blancs à la largeur que vous indiquez.

Le - left-justifie votre texte dans ce champ.

139
Carl Smotricz

printf permet de formater avec des spécificateurs de largeur. par exemple.


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Vous utiliseriez un spécificateur de largeur négative pour indiquer une justification à gauche, car la valeur par défaut consiste à utiliser une justification à droite.

21
PP.

De plus, si vous voulez avoir la possibilité de choisir le width, vous pouvez choisir l’un des deux formats suivants (avec ou sans troncature):

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."
16
lifebalance

Il y a aussi le %n modificateur qui peut aider dans certaines circonstances. Il retourne la colonne sur laquelle la chaîne était si loin. Exemple: vous voulez écrire plusieurs lignes qui sont dans la largeur de la première ligne comme une table.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

imprimera 2 colonnes de la même largeur quelle que soit la longueur des deux chaînes header1 et header2 puis-je avoir. Je ne sais pas si toutes les implémentations ont le %n mais Solaris et Linux le font.

12
Patrick Schlüter

Il existe également une solution peu technique consistant à compter manuellement l'ajout d'espaces pour aligner vos messages. Rien ne vous empêche d'inclure quelques espaces de fin dans vos chaînes de message.

1
Carl Smotricz