Как форматировать строки, используя printf(), чтобы получить равную длину в выходе?

У меня есть две функции, одна из которых создает такие сообщения, как Starting initialization..., а другая, которая проверяет коды возврата и выходы "Ok", "Warning" или "Error". Однако выход, который создается, имеет разную длину:

Starting initialization...Ok.
Checking init scripts...Ok.

Как я могу получить что-то вроде этого:

Starting initialization...       Ok.
Checking init scripts...         Ok.

Ответ 1

Вы можете указать ширину в строковых полях, например.

printf("%-20s", "initialization...");

а затем все, что напечатано с этим полем, будет заполнено пробелом до указанной вами ширины.

- влево - выравнивает текст в этом поле.

Ответ 2

printf позволяет форматировать с помощью спецификаторов ширины. например.


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

Вы использовали бы спецификатор отрицательной ширины, чтобы указать выравнивание по левому краю, поскольку по умолчанию используется правовое обоснование.

Ответ 3

Также существует модификатор %n, который может помочь при определенных обстоятельствах. Он возвращает столбец, на котором строка была до сих пор. Пример: вы хотите написать несколько строк, которые находятся в пределах ширины первой строки, например таблицы.

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

будет печатать 2 столбца одинаковой ширины любой длины, которые могут иметь две строки header1 и header2. Я не знаю, имеют ли все реализации %n, но Solaris и Linux делают.

Ответ 4

Кроме того, если вам нужна гибкость при выборе width, вы можете выбрать один из следующих двух форматов (с усечением или без него):

int width = 30;
//no truncation
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." ); 
//truncated to the specified width
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 

Ответ 5

Там также довольно низкотехнологичное решение для подсчета добавленных мест вручную, чтобы ваши сообщения выстраивались в линию. Ничто не мешает вам включать несколько строк в строки сообщений.

Ответ 6

Начните с использования Tabs, модификатора символов \t. Он переместится в фиксированное местоположение (столбцы, терминальный жаргон). Однако это не помогает, если есть различия больше ширины столбца (4 символа, если я правильно помню).

Чтобы исправить это, напишите свой материал "OK/NOK", используя фиксированное количество вкладок (5? 6?, попробуйте), затем верните (\r) без новой подкладки и напишите ваше сообщение.