我使用一些像这样的代码来打印一个表
print "\t1%s\t2%s\t3%s\t4%s", str1, str2, str3, str4
但是,有些str的宽度有点长,它的输出是这样的
1blabla 2blabla 3blabla 4blabla 1blablablabla 2blabla 3blabla 4blabla
有更好的方法来格式化这些字符串吗?
w8f9ii691#
首先,对于每一列,确定显示每个元素所需的最大长度,例如,通过迭代列条目并找到最大值strlen()。然后,对于每一行,打印相应的列条目并根据需要填充空格。下面是一个漂亮的C打印机,它接受一个指向字符串的2D指针数组(其中每个“行”都以NULL结尾,最后一行由所有NULL组成):
strlen()
NULL
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()。输出如下所示:
printf()
foo bar baz snafu fubar x
6vl6ewon2#
如果你知道编译时字符串的最大长度,你可以简单地用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代码被认为是糟糕的风格,但后者通常更可取,除非它使代码变得冗长而难以阅读。
stdio
iostream
2条答案
按热度按时间w8f9ii691#
首先,对于每一列,确定显示每个元素所需的最大长度,例如,通过迭代列条目并找到最大值
strlen()
。然后,对于每一行,打印相应的列条目并根据需要填充空格。下面是一个漂亮的C打印机,它接受一个指向字符串的2D指针数组(其中每个“行”都以
NULL
结尾,最后一行由所有NULL
组成):最丑陋的部分是C99可变大小数组和
printf()
调用中的格式说明符,而且,您可以优化掉一个strlen()
。输出如下所示:
6vl6ewon2#
如果你知道编译时字符串的最大长度,你可以简单地用
printf()
说明符来指示这个长度:或者使用C++流操纵器:
如果你想要可变宽度的列,这也允许你在运行时传递列宽。你也可以用
printf()
这样做,通过改变格式说明符并在字符串之前传递长度:在C++中混合使用
stdio
代码和iostream
代码被认为是糟糕的风格,但后者通常更可取,除非它使代码变得冗长而难以阅读。