今天两个snprintf
and vsnprintf
除了 MSVC12 及更早版本的 Windows 之外,应该在任何地方都可用。对您来说最简单的方法是提供snprintf
/vsnprintf
在 Windows 上它不可用。
Windows提供的功能_vsnprintf_s
这已经类似于vsnprintf
,但是在提供的缓冲区太小时会发生什么方面有以下重要区别:
- 缓冲区内容取决于附加的
count
不存在于的论证vsnprintf
。要得到vsnprintf
你可以通过的行为_TRUNCATE
here.
-
-1
返回而不是所需的字符数。这可以通过使用来修复_vscprintf
仅当先前调用时才需要调用的函数_vsnprintf_s
失败了。
此外,这些函数不支持 C99 中添加的格式说明符,例如%zd
。这不容易解决,您必须避免使用它们。
代码如下:
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
int r = -1;
if (size != 0)
{
va_list args_copy;
va_copy(args_copy, args);
r = _vsnprintf_s(buf, size, _TRUNCATE, fmt, args_copy);
va_end(args_copy);
}
if (r == -1)
{
r = _vscprintf(fmt, args);
}
return r;
}
int snprintf(char *buf, size_t size, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
int r = vsnprintf(buf, size, fmt, args);
va_end(args);
return r;
}
注:Windows还提供_vsnprintf
它看起来更适合此实现,但它不会终止结果字符串。如果你想使用它,你应该小心。