Левая панель printf с пробелами


114

Как я могу заполнить строку пробелами слева при использовании printf?

Например, я хочу напечатать «Hello» с 40 пробелами перед ним.

Кроме того, строка, которую я хочу напечатать, состоит из нескольких строк. Нужно ли мне печатать каждую строку отдельно?

РЕДАКТИРОВАТЬ: Чтобы быть ясным, я хочу, чтобы перед каждой строкой было напечатано ровно 40 пробелов.

Ответы:


125

Если вы хотите, чтобы слово «Hello» печаталось в столбце шириной 40 символов, с пробелами слева, используйте следующее.

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

Это даст вам 35 пробелов, а затем слово «Привет». Вот как вы форматируете материал, когда знаете, какой ширины вы хотите столбец, но данные меняются (ну, это один из способов сделать это).

Если вы знаете, что вам нужно ровно 40 пробелов, а затем некоторый текст, просто сохраните 40 пробелов в константе и распечатайте их. Если вам нужно напечатать несколько строк, используйте несколько printfоператоров, подобных приведенному выше, или выполняйте это в цикле, ptrкаждый раз меняя значение .


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

Да, это всегда давало бы вам 40 пробелов перед содержимым указателя. Это хорошее решение, но если вам придется это делать много, я думаю, что константа с 40 пробелами будет быстрее. Я не знаю, умеет ли компилятор оптимизировать форматы printf.
Bill the Lizard

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

И, чтобы обратиться к последней части Q: да, если вы хотите, чтобы каждая строка данных была напечатана с 40 ведущими пробелами, вам нужно сегментировать данные, чтобы каждая строка печаталась отдельно.
Джонатан Леффлер

4
@Jonathan Leffler: конечно, компилятор может оптимизировать форматы printf. Например, GCC оптимизирует printf ("% s \ n", foo) и заменяет его на put (foo).
Сэм Хосевар

73

Я использую эту функцию для создания отступа в моем выводе (например, для печати древовидной структуры). Это indentколичество пробелов перед строкой.

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

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

Обратите внимание, Рэй Хулха удалил конкатенацию строковых литералов, очевидно, для того, чтобы исправить «проблему компилятора».
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 03

@JinKwon любого персонажа, точно так же, как "Hello"может быть что угодно, он должен был привести пример
Джо

18

Если вы хотите, чтобы перед строкой было ровно 40 пробелов, вам нужно просто сделать:

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

Если это слишком грязно, вы можете сделать (но это будет медленнее, чем вручную ввести 40 пробелов): printf("%40s%s", "", myStr );

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

Вы также можете поставить "до" 40 пробелов ПОСЛЕ строки, выполнив: printf("%-40s", myStr);


2
как этот комментарий для пробелов после строки
один
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.