Как отформатировать строки, используя printf (), чтобы получить одинаковую длину в выводе?
-
05-07-2019 - |
Вопрос
У меня есть две функции, одна из которых выдает сообщения типа Starting initialization ...
, а другая проверяет коды возврата и выводит " Ok "
, " Предупреждение "
или " Ошибка "
. Однако полученный вывод имеет другую длину:
Starting initialization...Ok.
Checking init scripts...Ok.
Как я могу получить что-то вроде этого:
Starting initialization... Ok.
Checking init scripts... Ok.
Решение
Вы можете указать ширину в строковых полях, например, Р>
printf("%-20s", "initialization...");
и тогда все, что будет напечатано с этим полем, будет дополнено пробелом до указанной вами ширины.
-
выравнивает по левому краю ваш текст в этом поле.
Другие советы
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 ) без новой подкладки и напишите сообщение.