Affichage avec alignement justifié en C

/* Article modifié le 20/11/2025 afin de supprimer une variable inutile dans le code source */

Cet article propose un algorithme avec une implémentation en langage C permettant d’afficher un texte en alignement justifié. Ceci signifie que le texte est aligné à gauche et à droite sur un nombre de colonnes prédéfinies, la dernière ligne étant alignée à gauche. Le programme va donc insérer les espaces nécessaires entre les mots afin d’obtenir les alignements.

Vous aurez ainsi à disposition une fonction C permettant d’avoir une belle présentation pour vos jeux d’aventure textuels… et d’autres utilisations sont possibles, bien évidemment.

Cela semble assez simple en théorie, mais j’ai intégré les contraintes suivantes :

  • Pas d’utilisation de nombres réels (float) pour que le programme reste performant avec un ordinateur 8 bits.
  • Dans le cas ou un mot est plus long que le nombre de colonnes d’affichage, ce mot doit être coupé afin de conserver un affichage correct.
Présentation du programme jprint

Le programme est constitué de 4 fonctions :

jprint : affiche la totalité du message avec alignement justifié.

print_line_justified : affiche une ligne de mots avec alignement justifié

print_line_left : affiche une ligne avec alignement à gauche

print_word : affiche un mot

L’algorithme est relativement simple :

  • Il parcourt la chaîne de caractères à afficher du début à la fin.
  • Il construit ainsi une liste de mots à afficher sur une ligne (liste courante).
  • Lorsqu’un nouveau mot est détecté, il regarde si le nombre de caractères des mots de la liste courant en incluant le nouveau mot reste inférieur au nombre de colonnes maximum (constante NB_COL), en tenant compte d’un caractère d’espace entre chaque mot.
  • Si c’est le cas, le nouveau mot est ajouté à ligne courante car il reste suffisamment de place sur la ligne, et l’algo passe au mot suivant.
  • Sinon, la ligne courante est saturée et sera affichée en alignement justifié. Le nouveau mot constitue le premier mot de la nouvelle ligne à afficher.
  • Dans le cas où la longueur du nouveau mot est est supérieure à NB_COL, le nouveau mot est coupé ; une partie sera affichée sur la ligne courante, l’autre sur la ligne suivante.
Comment utiliser le programme ?

Vous pouvez utiliser jprint directement depuis la ligne de commande et passer le texte à afficher en argument (entre guillemets). En l’absence d’argument, le programme bascule en mode test et affiche une série de textes qui m’ont permis de déboguer le programme.

Pour utiliser jprint dans votre propre programme, il est nécessaire d’insérer les lignes 38 à 240 de jprint.c qui correspondent aux constantes, définitions des types, déclarations des fonctions et les quatre fonctions print_word, print_line_left, print_line_justified et jprint.

Vous pouvez choisir le nombre de colonnes d’affichage en modifiant la constante NB_COL.

CODE SOURCE

Voici le code source, accompagné d’un fichier makefile.

Pour compiler : extraire l’archive, ouvrir une fenêtre de commande, se placer dans le répertoire et saisir la commande make.

Et la suite ?

Dans un prochain article je publierai un jeu d’aventure textuel qui utilise jprint.

4 réponses sur “Affichage avec alignement justifié en C”

    1. Bonjour,
      merci d’avoir signalé ce warning qui n’apparaît la compilation avec l’option -Wall de gcc.
      Je modifie le code pour supprimer cette variable inutile.
      Quelles options de compilation utilisez-vous pour que ceci soit détecté ?
      Cordialement

      1. Le makefile conduit bien à l’option que vous indiquez. J’obtiens donc bien ce que je disais.
        gcc –version a pour résultat…
        clang version 21.1.6
        Il s’agit d’un travail de recherche que j’ai entrepris en utilisant termux…
        Target: aarch64-unknown-linux-android24

      2. Bonjour, J’ai besoin de mettre les liens symboliques au placard. Ainsi il s’agira bien du bon compilateur pour traiter de cette question
        Merci

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *