Следующая программа демонстрирует один из способов сделать это:
#include <stdio.h>
#include <stdarg.h>
void padf (size_t sz, int padch, char *fmt, ...) {
int wid;
va_list va;
// Get the width that will be output.
va_start (va, fmt);
wid = vsnprintf (NULL, 0, fmt, va);
va_end (va);
// Pad if it's shorter than desired.
while (wid++ <= sz)
putchar (padch);
// Then output the actual thing.
va_start (va, fmt);
vprintf (fmt, va);
va_end (va);
}
int main (void) {
padf (8, '*', "%.2f\n", 123.0);
padf (8, '*', "%.2f\n", 3.0);
return 0;
}
Просто вызовите padf
так же, как вы бы вызвали printf
, но с дополнительными аргументами ширины начальных символов и отступов и изменением "реальный »формат, чтобы исключить начальные пробелы или нули, такие как изменение %8.2f
на %.2f
.
. Он будет использовать стандартные переменные аргументы, чтобы определить фактическую ширину аргумента, а затем вывести достаточно символов заполнениядобавьте это к желаемой ширине перед выводом фактического значения.В соответствии с вашими требованиями, выход вышеупомянутой программы:
**123.00
****3.00
Очевидно, что это решение накладывается слева - вы можете сделать его более общим и передать, хотите ли вы дополнить его влево или вправо (для чисел/ strings) но это, вероятно, выходит за рамки вопроса.