106 votes

Comment formater des chaînes de caractères à l'aide de printf() pour obtenir une longueur égale dans la sortie.

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

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

Comment puis-je obtenir quelque chose comme ce qui suit ?

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

181voto

Carl Smotricz Points 36400

Vous pouvez spécifier une largeur pour les champs de type chaîne de caractères, par ex.

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

Ensuite, tout ce qui sera imprimé avec ce champ sera mis en blanc à la largeur que vous aurez indiquée.

El - justifie à gauche votre texte dans ce champ.

28voto

PP. Points 6741

printf permet le formatage avec des spécificateurs de largeur. Par exemple,

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

Vous devez utiliser un spécificateur de largeur négatif pour indiquer une justification à gauche, car la justification à droite est utilisée par défaut.

24voto

lifebalance Points 403

De plus, si vous souhaitez 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."

15voto

tristopia Points 5074

Il y a aussi le %n qui peut être utile dans certaines circonstances. Il renvoie la colonne sur laquelle se trouvait la chaîne jusqu'à présent. Exemple : vous voulez écrire plusieurs lignes qui sont dans la largeur de la première ligne comme un tableau.

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 deux colonnes de même largeur, quelle que soit la longueur des deux chaînes. header1 y header2 peut avoir. Je ne sais pas si toutes les implémentations ont la %n mais Solaris et Linux le font.

0voto

Carl Smotricz Points 36400

Il y a aussi la solution de basse technologie qui consiste à compter les espaces à la main pour que vos messages s'alignent. Rien ne vous empêche d'inclure quelques espaces de queue dans vos chaînes de messages.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X