Как да организирам правилно изхода в колони?

Първото нещо, което ми идва на ум, е да направя куп \t, но това би довело до неправилно подравняване на думите, ако някоя дума е по-дълга от всяка друга дума с няколко знака.

Например, бих искал да имам нещо като:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T

Вместо това, като включвам само "\t" в моето изявление cout, мога да успея само да получа

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName                T

or

Name    Last Name            Middle initial
Bob     Jones    M
Joe     ReallyLongLastName   T

Какво друго трябва да направя?

РЕДАКТИРАНЕ: Така че разбирам, че първо трябва да преброя максималната ширина на всяка колона, която искам да се показва, и след това да добавя съответно интервали за допълване. Но как и с какви функции мога да направя това? Трябва ли просто да преброя броя символи в низ и след това да продължа оттам?


person wrongusername    schedule 12.03.2010    source източник


Отговори (5)


Използвайте std::setw от <iomanip>

e.g.

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

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

Изход:

      This        is         a      test
person Peter Alexander    schedule 12.03.2010
comment
Мисля, че трябва да използвате и cout << left - person Alex Jasmin; 13.03.2010
comment
Благодаря и на теб, и на Александър! Най-накрая получих това, което исках :) - person wrongusername; 13.03.2010

Използвайте подложка printf() с флага минус за ляво подравняване

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

Което произвежда:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T
person Alex Jasmin    schedule 12.03.2010
comment
Честно, но като се имат предвид етикетите, може би решението на iostream би било предпочитано. - person Clifford; 13.03.2010

Трябва също така да вземете предвид, че различните редактори/изгледи показват текст с различна ширина на раздела. Така че с помощта на раздели текстът, който изглежда добре подреден в един зрител, може да изглежда грозен в друг.

Ако наистина искате да създадете хубава подредба, можете да използвате интервали за допълване и можете да направите две преминавания върху вашия текст: първо пребройте максималната ширина на всяка колона, след това добавете точното количество интервали за допълване към всяка колона. За последното можете също да използвате специално направено printf обаждане.

Актуализация: Преброяването на ширината на колоната основно означава преброяване на дължината на низовете, които имате в дадена колона. Може да се направи с помощта на string::length() или strlen(), в зависимост от това дали използвате std::string или char* ( първото се препоръчва). След това просто преминавате през всички думи в тази колона, сравнявате максималната дължина на думата, която имате досега, и ако текущата дума е по-дълга, задавате тази дължина да бъде новата максимална. Ако съхранявате думите си в STL контейнер, можете дори да използвате std::max_element алгоритъма, за да направите работата за вас с едно извикване на функция.

person Péter Török    schedule 12.03.2010
comment
Благодаря! Как мога да преброя максималната ширина на всяка колона? - person wrongusername; 13.03.2010
comment
Благодаря ти много! Това е още по-гъвкава реализация imo :P - person wrongusername; 13.03.2010

За ситуации като тази обикновено са необходими две преминавания: едно за откриване на максималната ширина на всяка колона и друго за отпечатване. За стандартни iostreams можете да използвате рутината width(), за да накарате iostream автоматично да обработва подложките вместо вас.

person fbrereto    schedule 12.03.2010

Използвайте форматиране на низ (от stdio), за да покажете всеки ред.

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

Ще ви позволи да зададете минимални ширини на полето и така ще запълни останалата част от всяко поле вместо вас.

person kafuchau    schedule 12.03.2010