簡體   English   中英

如何使用填充正確設置printf()的格式?

[英]How to format printf() correctly with padding?

我正在重新創建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 <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;
}

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

它按列打印數據(您可以顯示/隱藏邊框)。

代碼非常簡單,我相信您會在其中找到一些有用的提示。

希望能幫助到你 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM