Як відформатувати рядки за допомогою printf (), щоб отримати рівну довжину на виході?


92

У мене є дві функції: одна, яка видає такі повідомлення, Starting initialization...а інша перевіряє коди повернення та результати "Ok", "Warning"або "Error". Однак вироблена продукція має різну довжину:

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

Як я можу отримати щось подібне:

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

Відповіді:


159

Ви можете вказати ширину полів рядків, наприклад

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

і тоді все, що надруковано цим полем, буде заповнено пустим пробілом до вказаної вами ширини.

-Лівий виправдовує текст в цій області.


130
На жаль, я недостатньо кмітливий, щоб вважати так високо. Однак я довіряю
запитувачу

3
як щодо права виправданий? У K&R немає жодних прапорів
Ungeheuer

9
За замовчуванням вирівнено праворуч. Без символу a -ваші дані будуть правильно вирівняні в полі, ширину якого ви вказали.
Карл Смотрич,

24

printfдозволяє форматування за допомогою специфікаторів ширини. напр


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

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


18

Крім того, якщо вам потрібна гнучкість вибору 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."

13

Також є %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.


Це рішення працює, але будь-хто, хто бере це і вводить його у свій код, повинен знати про ризик появи вразливостей пам’яті .
Метью Коул

0

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


-2

Почніть із використання Tabs, модифікатора символів \ t . Він рухатиметься до фіксованого місця (колони, термінал жаргон). Однак це не допомагає, якщо є різниці, які перевищують ширину стовпця (4 символи, якщо я правильно пам’ятаю).

Щоб це виправити, напишіть свої матеріали "OK / NOK", використовуючи фіксовану кількість вкладок (5? 6?, Спробуйте), потім поверніть ( \ r ) без нової підкладки та напишіть своє повідомлення.


5
Завжди існує небезпека того, що рядок довший за табуляцію, що змушує неправильно вирівняти отриману вкладку та текст.
ПП.

Не дуже ... спочатку напишіть вкладку OK / NOK, потім / r, тепер напишіть фразу, зараз / n. Фраза може замінити OK / NOK. Але ваш шлях набагато кращий, я не знав про негативне виправдання.
jpinto3912
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.