Нет, прямой альтернативы нет.
Но если у вас хорошо ведет себя snprintf
(тот, который ведет себя, как описано в Стандарте C99), это работает без создания новой строки;создание только 2 временных int
s
#include <stdio.h>
int main(void) {
int filler = '#'; /* setfill('#') */
int width = 10; /* setw(10) */
int target = 5; /* 5 */
/* ******** */
int s = snprintf(NULL, 0, "%d", target);
for (int i = 0; i < width - s; i++) {
putchar(filler);
}
printf("%d\n", target);
/* ******** */
return 0;
}
EDIT: рабочая версия на ideone .
EDIT2: различия между стандартом C99 snprintf
и Windows _snprintf
( спасибо за ссылку, Бен ):
- Прототип:
int snprintf(char *restrict buffer, size_t n, const char *restrict format, ...);
- Прототип:
int _snprintf(char *buffer, size_t n, const char *format, ...);
snprintf
записывает не более (n-1) байтов, а NUL _snprintf
записывает не более (n) байтов, последний из которых может быть NUL или другим символом snprintf
возвращает количество символов, необходимое для формата (может быть больше n
) или -1
в случае ошибки кодирования _snprintf
возвращает отрицательное значение, если n
не большой для строки;или n
, если байт NUL не был записан в буфер.
Вы можете запустить неправильное поведение _snprintf
в цикле, увеличивая n
, пока не найдете правильное значение
/* absolutely not tested, written directly on SO text editor */
int i;
size_t rightvalue = 0;
char buffer[SOME_DEFAULT_VALUE];
do {
if (sizeof buffer < rightvalue) /* OOPS, BIG BIG OOPS */;
i = _snprintf(buffer, rightvalue, "%d", 42);
} while (i != rightvalue++);
/* rightvalue already has space for the terminating NUL */