我使用这样的代码来打印表格
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
如果您在编译时知道字符串的最大长度,您可以简单地使用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, ...);
stdio
在 C++ 中混合代码和代码被认为是一种糟糕的风格iostream
,但后者通常更可取,除非它使您的代码变得难以阅读。