c++ - 如何在 CLI 中打印表格

标签 c++ c ansi-c

我使用这样的代码来打印表格

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

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

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

有更好的方法来格式化这些字符串吗?

最佳答案

首先,对于每一列,确定显示每个元素所需的最大长度,例如通过迭代列条目并找到最大值 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   

关于c++ - 如何在 CLI 中打印表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308013/

相关文章:

c++ - 使用 mingw 编译时增加堆栈大小?

c - 将 8 字节值中的每个字节存储在数组中

c - 有没有办法将未知类型的数组作为参数传递给 C 中的函数?

c - 通过 IF 语句选择结构

c++ - 将 64 位循环拆分为多个整数上的 32 位循环

c++ - FlatBuffers 中的多个根表

c++ - 用于无等待生产者和阻塞消费者的环形缓冲区

c - 是否有可能不是 UI 线程的线程操作 UI 元素?

c - Do While with String 语句

c - 在C中将字符串插入另一个字符串