如何使用填充正确格式化printf()?

时间:2013-04-12 21:29:41

标签: c printf

我正在重新创建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 个答案:

答案 0 :(得分:4)

以下是:

printf("%8d", 334632);

d转换说明符之前的数字告诉printf()用空格填充打印的数字,以便它占据(至少)例如屏幕上的8个字符。你可以在那里写任何整数。您案例的完整格式字符串可能类似于:

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

如果您想要可变数量的填充:

printf("%*d\n", max_field_width, 42);

答案 1 :(得分:3)

对于每一列,您应找到最大长度,并应用该列的每个条目的该长度的填充。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

看看我的小型图书馆libTPrint:https://github.com/wizzard/libtprint

它以列显示数据(您可以显示/隐藏边框)。

代码很简单,我相信你会找到一些有用的提示。

希望它有所帮助!