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


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

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

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

Starting initialization...       Ok.
Checking init scripts...         Ok.
6 73

6 ответов:

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

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

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

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

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


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

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

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

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."

есть еще %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 делают.

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

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

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