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