C printf: переменная ширина столбца, выравнивание по левому краю - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь отформатировать вывод строки 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*));

затем для каждого i, calloc spaces[i], а затем вместо "%*s" я делаю %s%s, где вторая напечатанная строка - spaces[i].

Но даже это, похоже, не работает, потому что мне нужно было бы сделать

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

И я не знаю, сколько пробелов нужно жестко закодировать для третьего аргумента. Не существует операции " " * length, как в Python, для создания строки размером length, состоящей из " " символов.

1 Ответ

7 голосов
/ 21 марта 2019

Чтобы выровнять вывод по заданной ширине, добавьте знак - в спецификатор формата

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...