-2

このようなコードを使用してテーブルを印刷します

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

しかし、いくつかの str 幅が少し長いと、このように出力されます

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

これらの文字列をフォーマットするより良い方法はありますか?

4

2 に答える 2

1

まず、列ごとに、各要素を表示するのに必要な最大長を決定します。たとえば、列エントリを反復処理して最大長を見つけますstrlen()。次に、行ごとに、対応する列エントリを出力し、必要に応じてスペースを埋めます。

これは、文字列へのポインターの 2D 配列を取る C のプリティ プリンターです (ここで、各「行」はNULL終了し、最後の行はすべてNULLs で構成されます)。

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()です。また、1 つ最適化することもできますstrlen()

出力は次のようになります。

foo   bar   baz 
snafu fubar x   
于 2012-04-25T01:23:23.410 に答える
0

コンパイル時の文字列の最大長がわかっている場合は、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, ...);

stdioC ++でコードとコードを混在させるのはスタイルが悪いと考えられてiostreamいますが、コードが読みにくく冗長にならない限り、一般的には後者の方が適しています。

于 2012-04-25T02:26:43.790 に答える