印刷

2013-07-19 21 views
11

のフォーマットのprintfを使用してCで同じ幅の列は、私はこのコードを書いた:印刷

#include <stdio.h> 

void printme(char *txt1, char *txt2, char *txt3) 
{ 
    printf("TXT1: %9s TXT2 %9s TXT3 %9s\n", txt1, txt2, txt3); 
} 


int main() 
{ 
    printme("a","bbbbbbbeeeeebbbbb","e"); 
    printme("aaaaaaaa","bbbbbbbbbbbb","abcde"); 
    return 0; 
} 

それは動作しますが、私は、このような出力を持っている:

TXT1:   a TXT2 bbbbbbbeeeeebbbbb TXT3   e 
TXT1: aaaaaaaa TXT2 bbbbbbbbbbbb TXT3  abcde 

したがって、列の幅が等しくない。基本的には、私はこのようにしたいと思います。私の議論のテキストがどれほど長くても、私の関数はいつも素敵な書式設定された列を出力します。質問は、どうすればいいのですか?

素敵をsaingことで、私は私の印刷機能に渡すどのくらいのテキストに関係なく、それは常に例えば、等幅の列をプリントアウトすることを意味:

を、私はこのようになります。この出力を持っています:

私はそれがこのように(私のテキスト引数はなりますどのくらいに関係なく)を見てみたい
a   cd`   fg   ij 
a   cd    fg   ij 
a   cd    fg   ij 
ab   cd    fg   ij 
ab   cd    fg   i j 
ab   cd    fg   ij 
ab   cd    fg   ij 
ab   cde    fgh   ij 
ab   cde    fgh   ij 

a   cd`   fg   ij 
a   cd   fg   ij 
a   cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cd   fg   ij 
ab  cde   fgh   ij 
ab  cde   fgh   ij  
+2

* nice形式の列に* nice *を定義する*。 – ouah

+2

あなたのテキストを先にスキャンし、最長の文字列が何であるかを調べ、その長さを列のパディング値に使用します。 –

+0

おそらくhttp://stackoverflow.com/questions/2956296/printing-values-in-special-format-using-printfの複製物 –

答えて

4

あなたはtxt1txt2のための最大の長さを見つけ、そしてtxt3し、それをフォーマットすることができます。

// compute the max string length of txt1 inputs in advance 
int s1 = strlen(firstTxt1); 
if (s1 < strlen(secondTxt1) 
    s1 = strlen(secondTxt1); 
... 

printf("%.*s %.*s %.*s\n", s1, txt1, s2, txt2, s3, txt3); 
+0

出力が連続しているとどうなりますか?突然テーブルのような構造に情報を印刷する)、突然1つの列のデータはすべての前任者(列を広くする必要があります)よりも長いですか?私は '\ b'と' \ r'を知っていますが、実際にはこの問題を解決するものではありません。 – Arc676

+0

それは私のコンパイラかもしれませんが、なぜこの方法は私にとってはうまくいかないのですか? 'printf("%。* s "、5、" hi ");'長さが指定されていないのに '%5s'がうまく動作するように" hi "を表示するだけです。具体的にこれを詳しく説明するリンクはありますか?私は、Google検索用語が "printfで書式設定"されると仮定していますか? – Arc676

3

は残念ながら、これを行うためのTRIVIAL方法はありません。

次の2つのパス方法を行うことができ

- main()の中で:その後、

char **data[] = { { "a","bbbbbbbeeeeebbbbb","e" }, 
        {"aaaaaaaa","bbbbbbbbbbbb","abcde" } }; 


get_columwidths(data[0][0], data[0][1], data[0][2]); 
get_columwidths(data[1][0], data[1][1], data[1][2]); 

printme(data[0][0], data[0][1], data[0][2]); 
printme(data[1][0], data[1][1], data[1][2]); 

と、この:

int columnwidths[3]; 

void get_columwidths(const char *s1, const char *s2, const char *s3) 
{ 
    int len1 = strlen(s1); 
    int len2 = strlen(s2); 
    int len3 = strlen(s3); 

    if (columnwidths[0] < len1) columnwidths[0] = len1; 
    if (columnwidths[1] < len2) columnwidths[1] = len2; 
    if (columnwidths[2] < len3) columnwidths[2] = len3; 
} 

void printme(char *txt1, char *txt2, char *txt3) 
{ 
    printf("TXT1: %*s TXT2 %*s TXT3 %*s\n", 
      columnwidths[0], txt1, columnwidths[1], txt2, columnwidths[2], txt3); 
} 
+0

+1このメソッドは、受け入れられた答えのように '%。* s'の代わりに'%* s'を使うので、整数( '%* d')を出力するときに先行ゼロを表示しません。 – Arc676

8

彼らはより大きくしている場合は、文字列が切り捨てられるしたい場合カラム幅を指定すると、文字列フォーマット指定の精度を追加することができます。

printf("TXT1: %9.9s TXT2 %9.9s TXT3 %9.9s\n", txt1, txt2, txt3); 

printf()、プログラムがどのように見えるあなたの例の出力:

TXT1:   a TXT2 bbbbbbbee TXT3   e 
TXT1: aaaaaaaa TXT2 bbbbbbbbb TXT3  abcde 
2

私の簡単なライブラリ、libtprintを見てみましょう:コードは非常に単純ですhttps://github.com/wizzard/libtprint 、あなたはそれがどのように動作するかを理解することができるはずです。

基本的に必要なのは、各列のフィールドの幅で再生し、アライメントオフセットを計算することです。

希望すると助かります!