这才是正确的使用方法snprintf
and vsnprintf
除了 SunOS 4(它已经过时了 20 年)之外的每个操作系统上都有,所以你的问题出在其他地方。
我会做一个纯粹的猜测,并说我几乎可以肯定你的问题是你传递了 va_listap
into vsnprintf
它会消耗它,然后您希望它在下次调用时重置。这是不正确的,并且许多年前已经在 gcc 中停止工作(因为它只在某些体系结构上工作)。
Change:
n = vsnprintf(p, size, fmt, ap);
To:
va_list apc;
va_copy(apc, ap);
n = vsnprintf(p, size, fmt, apc);
va_end(apc);
看看是否有帮助。
这是一个简单的测试,看看发生了什么:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void
foo(const char *fmt, va_list ap)
{
#ifdef BAD
vprintf(fmt, ap);
#else
va_list apc;
va_copy(apc, ap);
vprintf(fmt, apc);
va_end(apc);
#endif
vprintf(fmt, ap);
}
void
bar(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
foo(fmt, ap);
va_end(ap);
}
int
main(int argc, char **argv)
{
bar("foo %s\n", "bar");
return 0;
}
运行时我得到这个:
$ cc -o foo foo.c && ./foo
foo bar
foo bar
$ cc -DBAD -o foo foo.c && ./foo
foo bar
foo ����