Умный способ форматировать таблицы на стандартный вывод в C - PullRequest
2 голосов
/ 18 декабря 2011

Я пытаюсь записать таблицу в стандартный вывод с числовыми данными.Я хотел бы отформатировать так, чтобы числа были выровнены следующим образом:

1234     23
 312   2314
  12    123

Я знаю, что максимальная длина числа составляет 6 символов, есть ли умный способ узнать, сколько пробелов необходимо вывести перед числом, чтобыэто выглядит именно так?

Ответы [ 3 ]

10 голосов
/ 18 декабря 2011

printf может быть самым быстрым решением:

#include <cstdio>

int a[] = { 22, 52352, 532 };

for (unsigned int i = 0; i != 3; ++i)
{
    std::printf("%6i %6i\n", a[i], a[i]);
}

Печать:

    22     22
 52352  52352
   532    532

Нечто подобное можно достичь с помощью сложной и многословной последовательности команд iostream; кто-то обязательно опубликует такой ответ, если вы предпочитаете его «чистый C ++».


Обновление: На самом деле, версия iostreams не намного страшнее. (Пока вы не хотите научного форматирования с плавающей запятой или шестнадцатеричного вывода, то есть.) Вот оно:

#include <iostreams>
#include <iomanip>

for (unsigned int i = 0; i != 3; ++i)
{
    std::cout << std::setw(6) << a[i] << " " << std::setw(6) << a[i] << "\n";
}
4 голосов
/ 18 декабря 2011

Для c используйте "% 6d" для указания печати, т.е.

for (unsigned i = 0; i < ROWS(a); ++i) {
    for (unsigned j = 0; j < COLS(a); ++j) 
        printf("%6d ", a[i][j]);
    printf("\n");
}

Для с ++,

for (unsigned i = 0; i < ROWS(a); ++i) {
    for (unsigned j = 0; j < COLS(a); ++j) 
         std::cout  << a[i][j] << ' ';  
    std::cout << std::setw(6) << std::endl;
}

Не забудьте #include <iomanip>.

Использование cout настоятельно рекомендуется по сравнению с printf из соображений безопасности типов. Если я правильно помню, Boost имеет безопасную замену для printf, так что вы можете использовать что вместо вас требуется строка формата, args form.

1 голос
/ 18 декабря 2011

Для удовольствия:

#include <boost/spirit/include/karma.hpp>

namespace karma = boost::spirit::karma;

int main(int argc, const char *argv[])
{
    std::vector<std::vector<int>> a = 
        { { 1,2,3 },
          { 4,5,6 },
          { 7,8,9 },
          { 10,11,12 },
          { 13,14,15 }, };

    std::cout << karma::format(
             *karma::right_align(7, ' ') [ karma::int_ ] % '\n', a) << "\n";

    return 0;
}

Вывод:

  1      2      3
  4      5      6
  7      8      9
 10     11     12
 13     14     15
...