如何使用填充正确格式化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函数以自动对齐的列格式化打印?

这是如何做:

 printf("%8d", 334632); 

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

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

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

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

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

这是基本的想法:

 #include  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  #include  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; } 

看看我的小型库libTPrint: https : //github.com/wizzard/libtprint

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

代码很简单,我相信你会发现有几个有用的提示。

希望能帮助到你 !