我正在重新创建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函数以自动对齐的列格式化打印?
答案 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
它以列显示数据(您可以显示/隐藏边框)。
代码很简单,我相信你会找到一些有用的提示。
希望它有所帮助!