Как правильно организовать вывод в столбцы? - PullRequest
25 голосов
/ 13 марта 2010

Первое, что приходит мне в голову, это сделать кучу \ 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

или

Name    Last Name            Middle initial
Bob     Jones    M
Joe     ReallyLongLastName   T

Что еще мне нужно сделать?

РЕДАКТИРОВАТЬ: Таким образом, я получаю, что сначала я должен посчитать максимальную ширину каждого столбца, который я хочу отобразить, а затем соответственно добавить пробелы. Но как и с какими функциями я могу сделать это? Должен ли я просто посчитать количество символов в строке, а затем перейти оттуда?

Ответы [ 5 ]

30 голосов
/ 13 марта 2010

Использование std::setw от <iomanip>

, например

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

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

Выход:

      This        is         a      test
7 голосов
/ 13 марта 2010

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

Если вы действительно хотите создать красивую аранжировку, вы можете использовать пробел и два прохода над текстом: сначала посчитайте максимальную ширину каждого столбца, затем добавьте правильное количество пробелов для каждого столбца. Для последнего вы также можете использовать сделанный на заказ printf вызов.

Обновление: Подсчет ширины столбца в основном означает подсчет длины строк в данном столбце. Это можно сделать с помощью string::length() или strlen(), в зависимости от того, используете ли вы std::string или char* (рекомендуется первое). Затем вы просто перебираете все слова в этом столбце, сравниваете максимальную длину слова, которая у вас есть, и если текущее слово длиннее, вы устанавливаете эту длину равной новому максимуму. Если вы храните свои слова в контейнере STL, вы даже можете использовать алгоритм std::max_element , чтобы выполнить эту работу за один вызов функции.

6 голосов
/ 13 марта 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
2 голосов
/ 13 марта 2010

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

0 голосов
/ 13 марта 2010

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

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

Это позволит вам установить минимальную ширину поля и заполнит остальные поля для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...