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

StackOverflow https://stackoverflow.com/questions/1809399

  •  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 ) без новой подкладки и напишите сообщение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top