我用一些像這樣的代碼來打印表如何打印表CLI
print "\t1%s\t2%s\t3%s\t4%s", str1, str2, str3, str4
但是,一些海峽寬度有點長,它輸出這樣
1blabla 2blabla 3blabla 4blabla
1blablablabla 2blabla 3blabla 4blabla
什麼更好的辦法來格式這些字符串?
我用一些像這樣的代碼來打印表如何打印表CLI
print "\t1%s\t2%s\t3%s\t4%s", str1, str2, str3, str4
但是,一些海峽寬度有點長,它輸出這樣
1blabla 2blabla 3blabla 4blabla
1blablablabla 2blabla 3blabla 4blabla
什麼更好的辦法來格式這些字符串?
首先,對於每一列,確定要顯示的每個元件所需要的最大長度,例如通過迭代列條目並找到最大值strlen()
。然後,對於每一行,根據需要打印相應的列條目並填充空格。
下面是一個在C漂亮的打印機是採用指針的二維數組爲字符串(其中每個「行」是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("");
}
}
最醜陋的部分是調用printf()
時C99可變大小數組和格式說明符。此外,您可以優化一個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';
這也允許y如果您想要可變寬度的列,請在運行時傳遞列寬。你可以用printf()
這樣做,也通過改變格式說明和傳遞長度的字符串之前:
printf("%*s ...\n", str1.length(), str1, ...);
它被認爲風格窮混合stdio
代碼和C++ iostream
代碼,但後者通常是優選的,除非它使您的代碼變得冗長冗長。
嘗試'的std :: setw'在''。 –
chris
2012-04-25 00:57:12
什麼會更好?在打印任何輸出之前,截斷字符串或查找集合中最長字符串的長度? – sarnold 2012-04-25 01:06:42
這是什麼類型的語言? Visual Basic? – 2012-04-25 01:08:48