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

114

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

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

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

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

titaniumdecoy
источник

Ответы:

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);
}
jk_
источник
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");

Надеюсь, это поможет кому-то вроде меня в будущем.

Rece Foc
источник
Я получил 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
как этот комментарий для пробелов после строки
один