web-dev-qa-db-fra.com

Comment organiser correctement la sortie en colonnes?

La première chose qui me vient à l'esprit est de faire un tas de\t, mais cela entraînerait un désalignement des mots si un mot est plus long que n'importe quel autre mot de quelques caractères.

Par exemple, je voudrais avoir quelque chose comme:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T

Au lieu de cela, en n'incluant que "\ t" dans ma déclaration cout, je ne peux que

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName                T

ou

Name    Last Name            Middle initial
Bob     Jones    M
Joe     ReallyLongLastName   T

Que devrais-je faire d'autre?

EDIT: Je comprends donc que je devrais d'abord compter la largeur maximale de chaque colonne que je veux afficher, puis ajouter des espaces de remplissage en conséquence. Mais comment et avec quelles fonctions puis-je procéder? Dois-je simplement compter le nombre de caractères dans une chaîne et ensuite partir de là?

25
wrongusername

Utilisation std::setw de <iomanip>

par exemple.

using std::cout;
using std::setw;

cout << setw(10) << "This" <<
        setw(10) << "is" <<
        setw(10) << "a" <<
        setw(10) << "test" << '\n';

Production:

      This        is         a      test
30
Peter Alexander

Vous devez également tenir compte du fait que différents éditeurs/lecteurs affichent du texte avec une largeur d'onglet différente. Ainsi, en utilisant des onglets, le texte qui semble bien organisé dans un visualiseur peut sembler laid dans un autre.

Si vous voulez vraiment produire un arrangement agréable, vous pouvez utiliser des espaces de remplissage et vous pouvez effectuer deux passes sur votre texte: comptez d'abord la largeur maximale de chaque colonne, puis ajoutez la bonne quantité d'espaces de remplissage à chaque colonne. Pour ce dernier, vous pouvez également utiliser un appel printf sur mesure.

Mise à jour: Compter la largeur de colonne signifie essentiellement compter la longueur des chaînes que vous avez dans la colonne donnée. Cela peut être fait en utilisant string::length() ou strlen(), selon que vous utilisez std::string ou char* (le premier est recommandé). Ensuite, vous parcourez tous les mots de cette colonne, comparez la longueur maximale du mot que vous avez jusqu'à présent, et si le mot actuel est plus long, vous définissez cette longueur comme étant le nouveau max. Si vous stockez vos mots dans un conteneur STL, vous pouvez même utiliser le std::max_element algorithme pour faire le travail pour vous avec un seul appel de fonction.

7
Péter Török

Utilisez printf() padding avec le drapeau moins pour l'alignement à gauche

 printf("%-8s%-21s%-7s%-6s\n", "Name", "Last Name", "Middle", "initial");
 printf("%-8s%-21s%-7s%-6s\n", "Bob", "Jones", "M", "");
 printf("%-8s%-21s%-7s%-6s\n", "Joe", "ReallyLongLastName", "T", "");

Ce qui produit:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T
6
Alex Jasmin

Pour des situations comme celle-ci, deux passes sont généralement nécessaires: une pour découvrir la largeur maximale de chaque colonne et une autre pour imprimer. Pour les iostreams standard, vous pouvez utiliser la routine width() pour que l'iostream gère automatiquement le remplissage pour vous.

2
fbrereto

Utilisez la mise en forme des chaînes (de stdio) pour afficher chaque ligne.

http://www.cppreference.com/wiki/c/io/printf

Il vous permettra de définir des largeurs de champ minimales et remplira donc le reste de chaque champ pour vous.

0
kafuchau