C99 в snprintf
печатает на строку и гарантирует не переполнения буфера:
char msg[48];
snprintf(msg, sizeof(msg),
"Player %s has lost %d hitpoints", victim.name, damage);
snprintf
возвращает количество символов, которые были написаны уже строка была достаточно большой. Поэтому, если возвращаемые значения равны или больше размера буфера, строка была усечена.
Это законно передать размер буфера нуля и нулевой указатель, так что вы можете сделать свой собственный выделение путем зондирующего вызова первого:
char *msg;
int n;
n = snprintf(NULL, 0,
"Player %s has lost %d hitpoints", victim.name, damage);
msg = malloc(n + 1);
n = snprintf(msg, n + 1,
"Player %s has lost %d hitpoints", victim.name, damage);
// do stuff with msg
free(msg);
На компиляторов GNU, не-sandard функции asprintf
будет делать это для вас:
char *msg = asprintf("Player %s has lost %d hitpoints",
victim.name, damage);
// do stuff with msg
free(msg);
'Sprintf()' ваш ответ – Haris
вы хотите [ 'Sprintf()'] (http://linux.die.net/man/3/sprintf)? –
. Идея Джона Кармака для этой функциональности интересна, как реализовано в движке Quake 3: https://github.com/id-Software/Quake-III-Arena/blob/master/code/splines/q_shared.cpp (строка 700). Обратите внимание, что вам нужен достаточно глубокий буфер или смешные вещи могут произойти с вложенными вызовами, и, конечно же, это большой нет-нет, если вы пишете многопоточный код. – szczurcio