我正在重新创建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

如您所见,最后一个条目没有对齐,因为“大小”列比其他列大如何告诉printf函数以带自动对齐列的格式化方式打印?

最佳答案

以下是方法:

printf("%8d", 334632);

d转换说明符之前的数字告诉printf()用空白填充打印的数字,以便它占用(至少)例如屏幕上的8个字符你可以在那里写任何整数案例的完整格式字符串可能如下:
"%9s\t%4d\t%8d\t%16s\n"

如果需要可变填充量:
printf("%*d\n", max_field_width, 42);

09-30 21:54