Imprimer des colonnes de largeur égale en C en utilisant le formatage printf

Je voudrais imprimer des colonnes en utilisant printf en C. J’ai écrit ce code:

#include  void printme(char *txt1, char *txt2, char *txt3) { printf("TXT1: %9s TXT2 %9s TXT3 %9s\n", txt1, txt2, txt3); } int main() { printme("a","bbbbbbbeeeeebbbbb","e"); printme("aaaaaaaa","bbbbbbbbbbbb","abcde"); return 0; } 

Cela fonctionne mais j’ai une telle sortie:

 TXT1: a TXT2 bbbbbbbeeeeebbbbb TXT3 e TXT1: aaaaaaaa TXT2 bbbbbbbbbbbb TXT3 abcde 

Donc, les colonnes ne sont pas de même largeur. En gros, je voudrais faire en sorte que peu importe la longueur du texte dans mon argument, ma fonction afficherait TOUJOURS de belles colonnes formatées. La question est: comment puis-je faire cela?

Je dis bien que, quelle que soit la longueur du texte que je passe à ma fonction d’impression, les colonnes de même largeur seront toujours imprimées, par exemple:

J’ai cette sortie qui ressemble à ceci:

 a cd` fg ij a cd fg ij a cd fg ij ab cd fg ij ab cd fg ij ab cd fg ij ab cd fg ij ab cde fgh ij ab cde fgh ij 

Je veux qu’il ressemble à ceci (peu importe combien de temps mes arguments de texte seront):

 a cd` fg ij a cd fg ij a cd fg ij ab cd fg ij ab cd fg ij ab cd fg ij ab cd fg ij ab cde fgh ij ab cde fgh ij 

Vous pouvez trouver la longueur maximale pour txt1 , txt2 et txt3 , puis la formater:

 // compute the max ssortingng length of txt1 inputs in advance int s1 = strlen(firstTxt1); if (s1 < strlen(secondTxt1) s1 = strlen(secondTxt1); ... printf("%.*s %.*s %.*s\n", s1, txt1, s2, txt2, s3, txt3); 

Si vous souhaitez que les chaînes soient tronquées si elles sont plus grandes que la largeur de la colonne, vous pouvez simplement append une précision pour la spécification du format de chaîne:

 printf("TXT1: %9.9s TXT2 %9.9s TXT3 %9.9s\n", txt1, txt2, txt3); 

Avec cette printf() , la sortie de votre exemple de programme ressemble à ceci:

 TXT1: a TXT2 bbbbbbbee TXT3 e TXT1: aaaaaaaa TXT2 bbbbbbbbb TXT3 abcde 

Malheureusement, il n’existe pas de méthode TRIVIAL pour le faire.

Vous pouvez faire une méthode en deux passes – dans main ():

 char **data[] = { { "a","bbbbbbbeeeeebbbbb","e" }, {"aaaaaaaa","bbbbbbbbbbbb","abcde" } }; get_columwidths(data[0][0], data[0][1], data[0][2]); get_columwidths(data[1][0], data[1][1], data[1][2]); printme(data[0][0], data[0][1], data[0][2]); printme(data[1][0], data[1][1], data[1][2]); 

et puis ceci:

 int columnwidths[3]; void get_columwidths(const char *s1, const char *s2, const char *s3) { int len1 = strlen(s1); int len2 = strlen(s2); int len3 = strlen(s3); if (columnwidths[0] < len1) columnwidths[0] = len1; if (columnwidths[1] < len2) columnwidths[1] = len2; if (columnwidths[2] < len3) columnwidths[2] = len3; } void printme(char *txt1, char *txt2, char *txt3) { printf("TXT1: %*s TXT2 %*s TXT3 %*s\n", columnwidths[0], txt1, columnwidths[1], txt2, columnwidths[2], txt3); } 

Jetez un oeil à ma bibliothèque simple, libtprint : https://github.com/wizzard/libtprint Le code est assez simple, vous devriez être capable de comprendre son fonctionnement.

En gros, vous avez besoin de jouer avec la largeur des champs pour chaque colonne et de calculer les décalages d’alignement.

J’espère que ça aide !