【问题标题】:C printf: variable string column width, left alignC printf:可变字符串列宽,左对齐
【发布时间】:2019-03-21 18:02:00
【问题描述】:

我正在尝试格式化 printf 字符串输出:

printf("%*s %*s %*s %*s %*s %*s %*s %*s %*s\n", 
maxlen[0], "intf", maxlen[1], "ssid", maxlen[2], 
"bssid", maxlen[3], "vlan", maxlen[4], "STA", 
maxlen[5], "tx-pkts", maxlen[6], "rx-pkts", maxlen[7],
 "security", maxlen[8], "Capabilities");

其中maxlen 是一个数组,在这种情况下,其值为 5、13、17、4、3、7、7、15 和 12。

但是,在输出中,字符串是右对齐的,这意味着它们浮动到其宽度大小的块的右侧。输出:

intf ssid bssid vlan STA tx-pkts rx-pkts security Capabilities

有没有办法让这些字符串向左浮动?

因此,例如,对于 width==15second-to-last 块,我想要 security[][][][][][][],而不是 [][][][][][][]security

我尝试创建一个 spacesarray 字符串,如下所示:

char **spaces = (char**)malloc(9*sizeof(char*));

然后,对于每个icallocspaces[i],然后,我不执行"%*s",而是执行%s%s,其中打印的第二个字符串是spaces[i]

但即使这样似乎也不起作用,因为我需要这样做

snprintf(spaces[i], maxlen[i]-size_of_string, "  (however many spaces)    ");

而且我不知道要为第三个参数硬编码多少空格。没有像 python 中那样的" " * length 操作来创建length 大小的" " 字符字符串。

【问题讨论】:

    标签: c pointers formatting


    【解决方案1】:

    要以给定的宽度左对齐输出,请在格式说明符中添加- 符号

    printf("%-*s %-*s %-*s %-*s %-*s %-*s %-*s %-*s %-*s\n", ... ); 
    

    width 提供的参数可以是计算得到的int 值。您可以像这样对宽度进行硬编码

    printf("%-10s\n", "string");
    

    如果不知道会占用多少空间,可以使用临时字符串

    char tempstr[100];
    int len = sprintf(tempstr, "%d", value);
    printf("%s%-*s\n", tempstr, 30 - len, "string");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多