2013-04-12 33 views
1

我正在重新创建unix shell命令,并且正在执行ls。我必须模仿ls -l显示权限,文件大小等。本机的ls -l如果格式化舒服,所以每列保持对齐这样的:如何用padding正确地格式化printf()?

-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

下面的方式:

printf("%8d", 334632); 

d转换指定前的数字告诉printf()到垫与空白打印的数目,使得它占据屏幕上的(至少),例如,8个字符。你可以在那里写任何整数。如果你想填充量可变

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

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

以前我见过这个,但是如果我想要8是一个根据给定的最长值而改变的数字 –

+1

@MattHintzke然后你使用'*'和一个额外的参数。请'man printf()'。 – 2013-04-12 21:34:49

3

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

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; 
} 
+0

不,这会输出6次“str%9d”。 – 2013-04-12 21:36:42

+0

@ H2CO3,它没有:http://ideone.com/x7tsEz – perreal

0

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

它打印在列中的数据(可以显示/隐藏边框)。代码很简单,我相信你会发现有几个有用的提示。

希望它有帮助!