Aligner les colonnes dans la fonction printf en C

Jinku Hu 12 octobre 2023
  1. Utilisez la notation %{integer}d pour aligner la sortie en C
  2. Utilisez la notation %*d pour aligner la sortie en C
  3. Utilisez les notations %*d et %{int}d pour aligner les colonnes du tableau
Aligner les colonnes dans la fonction printf en C

Cet article présente plusieurs méthodes pour aligner les colonnes dans la fonction printf en C.

Utilisez la notation %{integer}d pour aligner la sortie en C

printf fait partie de la bibliothèque d’E/S standard, et il peut être utilisé pour sortir une chaîne formatée dans le flux stdout. Le flux stdout est mis en mémoire tampon; ainsi, il peut y avoir des retards si la chaîne n’inclut pas de caractère de nouvelle ligne. Habituellement, la chaîne donnée ne sera pas imprimée tant que le tampon interne ne sera pas rempli; ce n’est qu’après ce point que le contenu est écrit dans le flux stdout.

printf utilise des spécificateurs de format commençant par le caractère % pour contrôler le formatage de la chaîne. En plus des différents spécificateurs pour les types de données intégrés, certains symboles peuvent ajouter diverses fonctionnalités telles que l’alignement et le remplissage. Dans ce cas, nous insérons l’entier donné entre les caractères % et le spécificateur de format pour indiquer le nombre d’espaces à remplir sur le côté gauche de l’élément de sortie. Par conséquent, nous pouvons inclure le même nombre pour les sorties de plusieurs lignes afin d’aligner les entrées vers la droite.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%10d %d\n", mm1, mm1);
  printf("%10d %d\n", mm2, mm2);
  printf("%10d %d\n", mm3, mm3);

  exit(EXIT_SUCCESS);
}

Production:

11011 11011
  111 111
   11 11

Utilisez la notation %*d pour aligner la sortie en C

Alternativement, le même formatage peut être obtenu en utilisant la notation %*d, qui nécessite en outre que l’entier soit fourni car les arguments de données sont - après la virgule. Cependant, si les spécificateurs de format multiples incluent le caractère %, ils doivent tous inclure une valeur entière distincte avant l’argument correspondant.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int mm1 = 11011;
  int mm2 = 111;
  int mm3 = 11;

  printf("%*d %d\n", 10, mm1, mm1);
  printf("%*d %d\n", 10, mm2, mm2);
  printf("%*d %d\n\n", 10, mm3, mm3);

  exit(EXIT_SUCCESS);
}

Production:

11011 11011
  111 111
   11 11

Utilisez les notations %*d et %{int}d pour aligner les colonnes du tableau

Enfin, nous pouvons combiner les deux méthodes dans différents scénarios et aligner les colonnes dans n’importe quelle sortie de table textuelle. Notez qu’il est parfois nécessaire que les entrées de colonne soient alignées à gauche. Nous pouvons y parvenir en insérant des valeurs entières négatives entre les spécificateurs de format ou en les passant comme arguments avec la notation %*d. Cette dernière solution est plus adaptée lorsque le remplissage n’est pas connu comme constant et peut être calculé dynamiquement pendant l’exécution.

#include <stdio.h>
#include <stdlib.h>

#ifndef MAX
#define MAX 10
#endif

int main(int argc, char const *argv[]) {
  char *row1[] = {"num", "name", "sum"};
  int col1[] = {1, 2, 3};
  char *col2[] = {"one", "two", "three"};
  int col3[] = {1243, 14234, 3324};

  printf("%*s | %*s | %*s\n", -3, row1[0], -MAX, row1[1], MAX, row1[2]);
  printf("%*c | %*c | %*c\n", -3, '-', -MAX, '-', MAX, '-');
  size_t len = sizeof col1 / sizeof col1[0];
  for (int i = 0; i < len; ++i) {
    printf("%-3d | %-10s | %10d\n", col1[i], col2[i], col3[i]);
  }

  exit(EXIT_SUCCESS);
}

Production:

num | name       |        sum
-   | -          |          -
1   | one        |       1243
2   | two        |      14234
3   | three      |       3324
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C IO