Как отформатировать строки, используя printf (), чтобы получить одинаковую длину в выводе? - PullRequest
78 голосов
/ 27 ноября 2009

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

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

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

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

Ответы [ 6 ]

136 голосов
/ 27 ноября 2009

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

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

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

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

20 голосов
/ 27 ноября 2009

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


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

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

15 голосов
/ 05 марта 2015

Кроме того, если вам нужна гибкость выбора 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."
12 голосов
/ 28 ноября 2009

Существует также модификатор %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 имеют.

1 голос
/ 27 ноября 2009

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

0 голосов
/ 27 ноября 2009

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

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

...