簡體   English   中英

printf() 填充 C 中的列

[英]printf() Padding for columns in C

我有一個 C 程序正在打印當前目錄中文件的詳細信息。 它是更具體的 ls 版本。 我無法讓列用一個空格字符分隔。 我的function如下:

    while ( (sd = readdir(dir)) != NULL) {
    lstat(sd->d_name, &sfile);

    printf("%hu", sfile.st_mode);

    printf("%d", sfile.st_nlink);

    pwd = getpwuid(sfile.st_uid);
    printf("%s", pwd->pw_name);

    grp = getgrgid(sfile.st_gid);
    printf("%s", grp->gr_name);

    printf("%lld", sfile.st_size);

    t = sfile.st_mtime;
    tmp = localtime(&t);
    strftime(MY_TIME, sizeof(MY_TIME), "%Y-%m-%d %H:%M", tmp);
    printf("%s", MY_TIME);

    printf("%s\n", sd->d_name);

我嘗試將 %-1s 添加到 printf 語句中,但這只會給我一個段錯誤。 如果有人可以幫助我,將不勝感激。 謝謝你。

我不能只添加空格,因為當您有例如文件鏈接號 > 10 在一列中並且在下一列中有一個單個數字鏈接號時,列將不會對齊。

Current output:
16877  5  bobmichaels  staff  160  2019-10-30 09:54
16832  23  bobmichaels  staff  736  2019-10-29 22:24

Desired output:
16877  5   bobmichaels  staff  160  2019-10-30 09:54
16832  23  bobmichaels  staff  736  2019-10-29 22:24

為什么不自己在每個 output 之后簡單地添加一個空格? 如果您將所有小的printf調用組合成一個打印所有的調用,則非常容易:

printf("%hu %d %s %s %lld %s %s\n",
       sfile.st_mode, sfile.st_nlink, pwd->pw_name, grp->gr_name, sfile.st_size, MY_TIME, sd->d_name);

如果您想要每列的特定寬度,請使用printf格式的字段寬度說明符,例如

printf("%-4hu %-5d %10s %10s %lld %10s %s\n",
       sfile.st_mode, sfile.st_nlink, pwd->pw_name, grp->gr_name, sfile.st_size, MY_TIME, sd->d_name);

[請注意,上面的字段寬度只是示例,請嘗試獲得您想要的寬度]


最后請注意,您永遠無法讓列在 100% 的時間內對齊,遲早您會得到一些太長以適合您決定的寬度的數據。 最好的解決方案是檢查它的常見程度,如果很常見然后調整寬度,否則真的沒有必要打擾。

如果我理解正確,為什么不把空格放在 printf 中,比如:

printf(" %s");

如果你想用右對齊打印列長度 10:

printf("%10s");

如果要打印長度為 10 的列左對齊:

printf("%-10s");

列將用空格填充,如果列大於 10 將推動其他列。

如果您希望它們被空格分隔,只需在“%lld”之后添加空格,或者如果您希望全部合理,則在下一個之前添加空格添加 \t

暫無
暫無

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

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