1

UNIX シェル コマンドを再作成し、現在 ls を実行しています。許可、ファイルサイズなどを表示する ls -l を模倣する必要があります。適切にフォーマットされている場合、ネイティブの ls -l は次のようにすべての列が整列したままになります。

-rw-r--r-- 1 matt matt 1474560 Apr 11 14:54 diskimage
drwxr-xr-x 2 matt matt    4096 Mar 25 15:31 Example
-rwxr-xr-x 1 matt matt   26375 Apr 12 14:24 final
-rwxr-xr-x 1 matt matt      75 Apr 11 14:39 log.sh

現在、私のバージョンの ls はほぼ同じことを行いますが、次のように printf() 関数で異なる値が使用されている場合に列が整列しません。

drwxr-xr-x     0   1024    Dec 03 14:11      .
drwxr-xr-x     0   1024    Dec 03 14:11      ..
drwxr-xr-x     0   1024    Dec 03 13:57      Z
drwxr-xr-x     0   1024    Dec 03 14:11      X
drwxr-xr-x     0   1024    Dec 03 13:56      Y
-rw-r--r--     0   334632    Dec 10 08:39      big

ご覧のとおり、サイズ列が残りの列よりも大きいため、最後のエントリは整列されていません。printf 関数に、列を自動的に整列させてフォーマットされた方法で印刷するように指示するにはどうすればよいですか?

4

4 に答える 4

4

方法は次のとおりです。

printf("%8d", 334632);

d変換指定子が印刷された数値に空白を埋め込むように指示する前の数値で、printf()(少なくとも) たとえば画面上で 8 文字を占めるようにします。そこには任意の整数を書き込むことができます。ケースの完全なフォーマット文字列は次のようになります。

"%9s\t%4d\t%8d\t%16s\n"

可変量のパディングが必要な場合:

printf("%*d\n", max_field_width, 42);
于 2013-04-12T21:32:17.250 に答える
3

各列について、最大長を見つけ、その列の各エントリのその長さのパディングを適用する必要があります。

于 2013-04-12T21:32:07.647 に答える
2

これが基本的な考え方です:

#include <stdio.h>

int main()
{
    int a[] = {1, 1213, 3133123, 312, 0, 2}; 
    int i;
    for (i = 0; i < 6; i++) 
        printf("str %9d\n", a[i]);
    return 0;
}

出力

str         1
str      1213
str   3133123
str       312
str         0
str         2

数学を使用して、必要な数のスペースを取得することもできます。

#include <stdio.h>
#include <math.h>

int main()
{
    int a[] = {1, 1213, 3133123, 312, 0, 2}; 
    int i, max_digits=0;
    for (i = 0; i < 6; i++) {
        int d;
        d = a[i] == 0 ? 1 : ceil(log(abs(a[i]))/log(10));
        if (d > max_digits)
            max_digits = d;
    }   
    for (i = 0; i < 6; i++) 
        printf("str %*d\n", max_digits + 1, a[i]);
    return 0;
}
于 2013-04-12T21:34:34.590 に答える
0

私の小さなライブラリ libTPrint を見てください: https://github.com/wizzard/libtprint

データを列に印刷します(境界線を表示/非表示にできます)。

コードは非常にシンプルです。役立つヒントがいくつか見つかると思います。

それが役に立てば幸い !

于 2013-04-12T21:38:11.590 に答える