C printf:可变字符串列的宽度,左对齐

时间:2019-03-21 18:02:00

标签: c pointers formatting

我正在尝试格式化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

是否可以将这些字符串向左浮动?

例如,我想要[][][][][][][]security代替security[][][][][][][],而不是width==15

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:7)

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

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