在C中使用stdout格式化表的智能方法

时间:2011-12-18 00:09:35

标签: c format stdout tabular

我正在尝试使用数值数据将表写入stdout。我想格式化,以便数字对齐如下:

1234     23
 312   2314
  12    123

我知道这个数字的最大长度是6个字符,有没有一种聪明的方法可以知道在数字之前需要输出多少空格,所以它看起来就像这样?

3 个答案:

答案 0 :(得分:10)

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";
}

答案 1 :(得分:4)

对于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");
}

对于c ++,

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形式。

答案 2 :(得分:1)

为了好玩:

#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