【问题标题】:printf() Padding for columns in Cprintf() 填充 C 中的列
【发布时间】:2020-02-25 20:51:02
【问题描述】:

我有一个 C 程序正在打印当前目录中文件的详细信息。它是更具体的 ls 版本。我无法让列用一个空格字符分隔。我的功能如下:

    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);

我尝试在 printf 语句中添加 %-1s,但这只会给我一个段错误。如果有人可以帮助我,将不胜感激。谢谢你。

我不能只添加空格,因为当您有例如文件链接编号 > 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

【问题讨论】:

  • 嗨,请编辑问题并显示您现有的输出以及您的期望。

标签: c printf padding


【解决方案1】:

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

printf(" %s");

如果你想用右对齐打印一个长度为 10 的列:

printf("%10s");

如果要打印长度为 10 的列左对齐:

printf("%-10s");

列将用空格填充,如果列大于 10 将推动其他列。

【讨论】:

    【解决方案2】:

    为什么不自己在每个输出后添加一个空格?如果您将所有小的 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% 的时间内对齐,迟早您会得到一些太长以适应您决定的宽度的数据。最好的办法是检查它的普遍程度,如果普遍就调整宽度,否则真的没必要费心。

    【讨论】:

      【解决方案3】:

      如果你希望它们被空格分隔,只需在“%lld”之后或下一个之前添加空格 如果你想证明一切都是合理的,请添加 \t

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-07
        • 2020-03-27
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2021-09-19
        相关资源
        最近更新 更多