HOWTO · C

Aligner les colonnes dans la fonction printf en C

Cet article explique comment aligner les colonnes dans la fonction printf en C

Sur cette page

Utilisez une largeur de champ avec printf pour aligner des colonnes en C. %10d aligne un entier à droite dans un champ d’au moins 10 caractères ; %*d prend cette largeur dans un argument, et %0*d complète un entier avec des zéros à gauche. Utilisez %-*s ou le drapeau - pour aligner le texte à gauche dans un tableau.

Utiliser une largeur de champ pour aligner la sortie en C

La largeur de champ définit le nombre minimal de caractères utilisés pour une valeur. Pour un entier, %10d aligne la valeur à droite et ajoute des espaces à gauche si elle comporte moins de 10 caractères. Une valeur plus longue est affichée en entier : la largeur ne la tronque donc pas. Cette méthode est utile pour aligner les derniers caractères d’une colonne ; les valeurs plus courtes commencent plus à droite, car la conversion est alignée à droite.

Cet exemple complet montre les valeurs alignées à droite à côté d’un séparateur visible :

#include <stdio.h>

int main(void) {
  int values[] = {11011, 111, 11};

  for (int i = 0; i < 3; ++i) {
    printf("%10d | %d\n", values[i], values[i]);
  }

  return 0;
}
     11011 | 11011
       111 | 111
        11 | 11

La première conversion réserve une largeur minimale de 10 ; la seconde utilise la largeur naturelle de la valeur. Le caractère | rend la limite du champ visible. En règle générale, le nombre indiqué dans un format comme %10d correspond à la largeur minimale totale du champ, et non au nombre d’espaces à ajouter.

Utiliser %*d pour une largeur de champ dynamique

Utilisez %*d lorsque la largeur du champ n’est connue qu’au moment de l’exécution du programme. Chaque * dans une conversion consomme un argument de type int, placé juste avant la valeur correspondante. Par exemple, dans printf("%*d", width, value), width fournit la largeur du champ et value l’entier à afficher.

Cet exemple complet définit la largeur à l’exécution et la transmet juste avant chaque valeur entière :

#include <stdio.h>

int main(void) {
  int width = 10;
  int values[] = {11011, 111, 11};

  for (int i = 0; i < 3; ++i) {
    printf("%*d | %d\n", width, values[i], values[i]);
  }

  return 0;
}
     11011 | 11011
       111 | 111
        11 | 11

La première conversion utilise la valeur de width comme largeur minimale du champ : les entiers plus courts reçoivent des espaces à gauche et les valeurs plus longues restent intactes. La deuxième conversion affiche le même entier à sa largeur naturelle.

Le drapeau - aligne la valeur à gauche. Il peut être associé à une largeur dynamique avec %-*d ; l’argument de largeur reste placé avant celui de la valeur. Par exemple, printf("%*d | %-*d\n", width, value, width, value) place width avant chaque entier correspondant. Par défaut, le premier champ est aligné à droite et le second à gauche. Si la disposition varie selon les lignes, transmettez une largeur différente avant la valeur concernée.

Combiner les largeurs de champ pour aligner les colonnes d’un tableau

Dans un tableau mêlant texte et nombres, attribuez aux champs des largeurs adaptées aux colonnes souhaitées. Le drapeau - aligne les libellés à gauche, tandis que les conversions d’entiers sans ce drapeau alignent les nombres à droite. Un séparateur | distingue les colonnes. Avec %*.*d, le premier * consomme la largeur, le second la précision, et le dernier argument fournit la valeur entière. La précision d’un entier définit un nombre minimal de chiffres et ajoute des zéros à gauche si nécessaire.

Cet exemple complet utilise des colonnes de largeur fixe pour les en-têtes et les lignes d’exemple. Les libellés visibles du tableau restent en anglais, car les blocs de code et de sortie sont conservés inchangés :

#include <stdio.h>

int main(void) {
  int width = 12;

  printf("%-*s | %-*s | %*s\n", width, "Number", width,
         "Description", width, "Value");
  printf("%-*d | %-*s | %*.*d\n", width, 123, width, "First",
         width, 4, 4567);
  printf("%-*d | %-*s | %*.*d\n", width, 456, width, "Second",
         width, 4, 789);

  return 0;
}
Number       | Description  |        Value
123          | First        |         4567
456          | Second       |         0789

Ici, les colonnes du numéro et de la description sont alignées à gauche pour faciliter la lecture des lignes ; supprimez - d’une conversion d’entier pour aligner ce nombre à droite. Chaque largeur ou précision indiquée avec * doit correspondre à un argument int, dans le même ordre. La largeur d’affichage dans le terminal peut varier pour du texte contenant des caractères multioctets ou larges ; ces exemples orientés octets utilisent donc du texte ASCII ordinaire.

Utiliser %0*d pour compléter les entiers avec des zéros

Utilisez %0*d lorsqu’un entier doit occuper une largeur minimale complétée par des zéros à gauche. Le * consomme l’argument de largeur avant l’entier. Contrairement aux espaces ajoutés par %*d, les zéros à gauche permettent de conserver un nombre de chiffres constant pour les identifiants et les compteurs numériques.

Cet exemple complet affiche deux entiers sur une largeur minimale de cinq chiffres :

#include <stdio.h>

int main(void) {
  int width = 5;

  printf("%0*d\n", width, 123);
  printf("%0*d\n", width, 7);

  return 0;
}
00123
00007

La largeur est minimale : une valeur comportant plus de chiffres que la largeur choisie est tout de même affichée en entier. Dans un tableau, appliquez la même largeur numérique à chaque ligne ; utilisez des champs complétés par des espaces pour les en-têtes ou le texte.

Conclusion

Choisissez %10d ou une autre largeur de champ fixe lorsque la disposition est connue. Utilisez %*d lorsque la largeur provient d’une variable, et ajoutez - pour aligner un champ à gauche. Utilisez %0*d pour les identifiants ou les compteurs numériques qui nécessitent des zéros à gauche. Ces formats facilitent la lecture d’une sortie console composée de texte ASCII ordinaire ; pour d’autres textes, la largeur d’affichage du terminal peut modifier l’alignement.