2012-04-25 47 views
-1

我用一些像這樣的代碼來打印表如何打印表CLI

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

但是,一些海峽寬度有點長,它輸出這樣

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

什麼更好的辦法來格式這些字符串?

+0

嘗試'的std :: setw'在''。 – chris 2012-04-25 00:57:12

+0

什麼會更好?在打印任何輸出之前,截斷字符串或​​查找集合中最長字符串的長度? – sarnold 2012-04-25 01:06:42

+2

這是什麼類型的語言? Visual Basic? – 2012-04-25 01:08:48

回答

1

首先,對於每一列,確定要顯示的每個元件所需要的最大長度,例如通過迭代列條目並找到最大值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 
+0

'std :: string :: length'比'strlen'更好。 – chris 2012-04-25 01:27:11

+0

@chris:好點!我指的是「C」標籤,對C++沒有什麼經驗。 – Philip 2012-04-25 01:29:23

0

如果你知道在編譯時字符串的最大長度,你可以簡單地指示與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代碼,但後者通常是優選的,除非它使您的代碼變得冗長冗長。