11

C で printf を使用して列を印刷したいと思います。次のコードを書きました。

#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

したがって、列は等幅ではありません。基本的に、引数のテキストがどれだけ長くても、関数は常に適切にフォーマットされた列を出力するようにしたいと思います。問題は次のとおりです。どうすればこれを行うことができますか?

いいと言ったのは、印刷関数に渡したテキストの長さに関係なく、常に等幅の列が印刷されることを意味していました。次に例を示します

次のような出力があります。

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    
4

4 に答える 4

3

残念ながら、これを行うための TRIVIAL メソッドはありません。

main() で 2 パス メソッドを実行できます。

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);
}
于 2013-07-19T17:23:17.330 に答える
3

私の単純なライブラリlibtprintを見てみましょう: https://github.com/wizzard/libtprint コードは非常に単純で、その仕組みを理解できるはずです。

基本的に必要なのは、各列のフィールド幅をいじって、配置オフセットを計算することです。

それが役に立てば幸い !

于 2013-07-19T19:40:17.710 に答える