Short story: Microsoft has finally implemented snprintf in Visual Studio 2015. On earlier versions you can simulate it as below.
Long version:
Here is the expected behavior for snprintf:
int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );
Writes at most buf_size - 1
characters to a buffer. The resulting
character string will be terminated with a null character, unless
buf_size
is zero. If buf_size
is zero, nothing is written and
buffer
may be a null pointer. The return value is the number of
characters that would have been written assuming unlimited buf_size
,
not counting the terminating null character.
Releases prior to Visual Studio 2015 didn't have a conformant implementation. There are instead non-standard extensions such as _snprintf()
(which doesn't write null-terminator on overflow) and _snprintf_s()
(which can enforce null-termination, but returns -1 on overflow instead of the number of characters that would have been written).
Suggested fallback for VS 2005 and up:
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf
__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
int count = -1;
if (size != 0)
count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
if (count == -1)
count = _vscprintf(format, ap);
return count;
}
__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
int count;
va_list ap;
va_start(ap, format);
count = c99_vsnprintf(outBuf, size, format, ap);
va_end(ap);
return count;
}
#endif
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…