【问题标题】:How to format printf() correctly with padding?如何使用填充正确格式化 printf()?
【发布时间】:2013-04-12 21:29:40
【问题描述】:

我正在重新创建 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 函数以自动对齐列的格式化方式打印?

【问题讨论】:

    标签: c printf


    【解决方案1】:

    方法如下:

    printf("%8d", 334632);
    

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

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

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

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

    【讨论】:

    • 我以前见过这个,但是如果我希望 8 是一个根据给定的最长值而变化的数字怎么办
    • @MattHintzke 然后使用* 和一个附加参数。请man printf().
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是基本思想:

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

      【讨论】:

      • 不,这会输出"str % 9d" 6 次。
      【解决方案4】:

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

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

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

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 2012-03-14
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多