1

我正在重新创建 unix shell 命令,目前正在执行 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

如您所见,最后一个条目未对齐,因为 size 列大于其余列。如何告诉 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 回答