snprintf(3) 的 Linux 手册页给出了以下示例:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char *
make_message(const char *fmt, ...)
{
int n;
int size = 100; /* Guess we need no more than 100 bytes */
char *p, *np;
va_list ap;
if ((p = malloc(size)) == NULL)
return NULL;
while (1) {
/* Try to print in the allocated space */
va_start(ap, fmt);
n = vsnprintf(p, size, fmt, ap);
va_end(ap);
/* Check error code */
if (n < 0)
return NULL;
/* If that worked, return the string */
if (n < size)
return p;
/* Else try again with more space */
size = n + 1; /* Precisely what is needed */
if ((np = realloc (p, size)) == NULL) {
free(p);
return NULL;
} else {
p = np;
}
}
}
之后/* check error code */
不应该是:
if (n < 0) {
free(p);
return NULL;
}
为了避免内存泄漏?
我不能发布这个,因为单词与代码的比例不正确,所以我必须在最后添加一些文本。请忽略这一段,因为上面是完整的和重点。我希望这是足够的文字可以接受。
顺便说一句:我喜欢最后一行p = np;