Подтвердить что ты не робот

Как правильно организовать вывод в столбцы?

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

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

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

4b9b3361

Ответ 1

Используйте 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

Ответ 2

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

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

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

Ответ 3

Используйте пробел 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

Ответ 4

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

Ответ 5

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

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

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