2010-03-12 5 views
23

La première chose qui me vient à l'esprit est de faire un tas de \ t, mais cela ferait que les mots soient mal alignés si un mot est plus long que n'importe quel autre mot de quelques caractères.Comment organiser correctement la sortie en colonnes?

Par exemple, je voudrais avoir quelque chose comme:

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName T 

Au lieu de cela, pour ne l ' "\ t" dans ma déclaration Cout Je ne peux gérer pour obtenir

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName    T 

ou

Name Last Name   Middle initial 
Bob  Jones M 
Joe  ReallyLongLastName T 

Quoi d'autre dois-je faire?

EDIT: Donc, je comprends 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 faire cela? Dois-je simplement compter le nombre de caractères dans une chaîne, puis partir de là?

Répondre

28

Utilisation de std::setw<iomanip>

par exemple,

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

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

Sortie:

 This  is   a  test 
+7

Je pense que vous devriez également utiliser 'cout << left' –

+0

Merci à vous deux et Alexandre! J'ai finalement eu ce que je voulais :) – wrongusername

7

Vous devez également tenir compte du fait que les différents éditeurs/visionneuses affichent du texte avec une largeur de tabulation différente. Donc, en utilisant des onglets, le texte qui semble bien rangé dans une visionneuse peut sembler laid dans un autre. Si vous voulez vraiment produire un arrangement sympa, vous pouvez utiliser des espaces de remplissage, et vous pouvez faire deux passages sur votre texte: compter d'abord la largeur maximale de chaque colonne, puis ajouter la bonne quantité d'espaces de remplissage à chaque colonne. Pour ce dernier, vous pouvez également utiliser un appel sur mesure printf.

Mise à jour: Le comptage de la largeur de colonne signifie essentiellement le comptage de la longueur des chaînes que vous avez dans une colonne donnée. Il peut être fait en utilisant string::length() ou strlen(), selon que vous utilisez std::string ou char* (le premier est recommandé). Ensuite, il vous suffit de parcourir tous les mots de cette colonne, de comparer la longueur maximale de mots que vous avez jusqu'ici et, si le mot actuel est plus long, de définir cette longueur comme étant le nouveau maximum. Si vous stockez vos mots dans un conteneur STL, vous pouvez même utiliser le std::max_element algorithm pour effectuer le travail pour vous avec un appel de fonction unique.

+0

Merci! Comment puis-je compter la largeur maximale de chaque colonne? – wrongusername

+0

@ wrongusername pls voir ma mise à jour. –

+0

Merci beaucoup! C'est une implémentation encore plus flexible imo: P – wrongusername

6

Utilisez printf() padding avec le moins drapeau pour gauche-alignement

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", ""); 

qui produit:

Name Last Name   Middle initial 
Bob  Jones    M 
Joe  ReallyLongLastName T 
+2

Assez juste, mais étant donné les tags, peut-être qu'une solution iostream aurait été préférée. – Clifford

2

Pour ce genre de situations généralement deux passes sont nécessaires: l'un pour découvrir la largeur max de chaque colonne et un autre pour faire l'impression. Pour les iostreams standard, vous pouvez utiliser la routine width() pour que l'iostream gère automatiquement le remplissage.

Questions connexes