如何在CLI中打印表

时间:2012-04-25 00:56:36

标签: c++ c ansi

我使用这样的代码打印表

print "\t1%s\t2%s\t3%s\t4%s", str1, str2, str3, str4

但是,有些str宽度有点长,它会像这样输出

1blabla   2blabla   3blabla  4blabla
1blablablabla       2blabla  3blabla  4blabla

格式化这些字符串的更好方法是什么?

2 个答案:

答案 0 :(得分:1)

首先,对于每列,确定显示每个元素所需的最大长度,例如,通过迭代列条目并找到最大strlen()。然后,对于每一行,打印相应的列条目并根据需要填充空格。

这是C中的一个漂亮的打印机,它带有一个指向字符串的2D数组(其中每个“行”为NULL - 终止,最后一行包含所有NULL s):

void print_pretty(char ***arr)
{
    int i, j, cols;

    /* count columns */
    j = cols = 0;
    while (arr[0][j++]) cols++;

    /* init column sizes */
    size_t sizes[cols];
    for (j = 0; j < cols; sizes[j++]=0);

    /* 1st pass: calculate column widths */
    for (i = 0; arr[i][0]; i++)
            for (j = 0; arr[i][j]; j++)
                    if (strlen(arr[i][j]) > sizes[j])
                            sizes[j] = strlen(arr[i][j]);

    /* 2nd pass: print table */
    for (i = 0; arr[i][0]; i++) {
            for (j = 0; arr[i][j]; j++)
                    printf("%-*2$s ", arr[i][j], sizes[j]);
            puts("");
    }
}

最丑陋的部分是C99可变大小数组和调用printf()时的格式说明符。此外,您可以优化一个strlen()

输出如下:

foo   bar   baz 
snafu fubar x   

答案 1 :(得分:0)

如果您在编译时知道字符串的最大长度,则只需使用printf()格式说明符指示该长度:

printf("%12s %12s %12s %12s\n", str1, str2, str3, str4);

或者使用C ++流操纵器:

#include <iomanip>
...
cout << setw(12) << str1 << ... << '\n';

如果需要可变宽度列,这也允许您在运行时传递列宽。您也可以通过更改格式说明符并在字符串前面传递长度来使用printf()

printf("%*s ...\n", str1.length(), str1, ...);

在C ++中混合stdio代码和iostream代码被认为是糟糕的风格,但后者通常更可取,除非它使您的代码难以理解。