Зніміть пробіл printf з пробілами


114

Як я можу прокладати рядок з пробілами зліва при використанні printf?

Наприклад, я хочу надрукувати "Привіт" з 40 пробілами, що передують йому.

Також рядок, який я хочу надрукувати, складається з декількох рядків. Чи потрібно друкувати кожен рядок окремо?

РЕДАКТУВАННЯ: Просто, щоб було зрозуміло, я хочу перед кожним рядком надрукувати рівно 40 пробілів.

Відповіді:


125

Якщо ви хочете друкувати слово "Привіт" у стовпці, шириною 40 символів, з пробілами, розміщеними ліворуч, скористайтеся наступним.

char *ptr = "Hello";
printf("%40s\n", ptr);

Це дасть вам 35 пробілів, потім слово "Привіт". Таким чином ви форматуєте матеріал, коли знаєте, наскільки широкий стовпець ви хочете, але дані змінюються (ну, це є одним із способів зробити це).

Якщо ви знаєте, що ви хочете рівно 40 пробілів, то трохи тексту, просто збережіть 40 пробілів у постійній формі та надрукуйте їх. Якщо вам потрібно надрукувати декілька рядків, або використовуйте кілька printfоператорів, подібних до наведених вище, або робіть це у циклі, змінюючи значення ptrкожного разу.


3
не надто багато про прапори формату. але я підозрюю printf ("% 40s% s \ n", "", ptr); Ви можете використовувати його для розміщення на 40 пробілах?
Йоханнес Шауб - ліб

Так, це завжди дасть вам 40 пробілів до вмісту вказівника. Це приємне рішення, але якщо вам доведеться це зробити багато, я думаю, що константа з 40 пробілами була б швидшою. Я не знаю, чи зможе компілятор оптимізувати формати printf.
Білл Ящірка

38
Крім того, якщо у вас є змінна int 'n', яка містить кількість пробілів, які слід включити, ви можете використовувати: printf ("% * s% s \ n", n, "", ptr); щоб отримати змінну кількість пробілів.
Джонатан Леффлер

І, щоб вирішити останню частину Q: так, якщо ви хочете, щоб кожен рядок даних був надрукований з 40 провідними пробілами, то вам потрібно сегментувати дані, щоб кожен рядок був надрукований окремо.
Джонатан Леффлер

4
@Jonathan Leffler: звичайно, компілятор може оптимізувати формати printf. Наприклад, GCC оптимізує printf ("% s \ n", foo) і замінює його put (foo).
sam hocevar

73

Я використовую цю функцію для відступу мого результату (наприклад, для друку структури дерева). indentЄ кількість прогалин перед рядком.

void print_with_indent(int indent, char * string)
{
    printf("%*s%s", indent, "", string);
}

7
Мені подобається, що ви використовуєте рядкове буквене з'єднання, щоб відступ відрізнити від решти формату printf. Одна пропозиція: використовуйте порожній рядок замість одного пробілу для рядка відступу. Таким чином відступ == 0 буде працювати, як очікувалося. (тобто printf(..., indent, "", ...))
uroeuroburɳ

Зауважте, Рей Хулха видалив рядкове буквальне з'єднання, очевидно, щоб виправити "проблему компілятора".
mwfearnley

42
int space = 40;
printf("%*s", space, "Hello");

Цей оператор зарезервує рядок з 40 символів, друкуючи рядок в кінці рядка (видаляючи зайві пробіли, щоб загальна довжина рядка була постійною на рівні 40). Те саме можна використовувати для символів та цілих чисел наступним чином:

printf("%*d", space, 10);
printf("%*c", space, 'x');

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

printf("%*d", 10, 10);
printf("%*c", 20, 'x');
printf("%*s", 30, "Hello");

Сподіваюся, це допоможе комусь, як я, у майбутньому.


Я отримав error: empty character constantдля ''. Чи не повинно бути ' '?
Джин Квон

Так, слід.
shjeff

@ JinKwon будь-який персонаж, як "Hello"і будь-що, він мав би використати приклад
Джо Пеллет'є

18

Якщо ви хочете рівно 40 пробілів перед рядком, тоді вам слід просто зробити:

printf("                                        %s\n", myStr );

Якщо це занадто брудно, ви можете зробити це (але це буде повільніше, ніж ввести 40 пробілів вручну): printf("%40s%s", "", myStr );

Якщо ви хочете, щоб рядок вишикувались у стовпчику 40 (тобто майте до 39 пробілів, обробляючи її таким чином, що найправіший символ знаходиться у стовпці 40), зробіть це: printf("%40s", myStr);

Ви також можете поставити "до" 40 пробілів ПІСЛЯ рядок, виконавши: printf("%-40s", myStr);


2
подобається цей коментар для пробілів після рядка
oneat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.