Histoire courte : Microsoft a enfin implémenté snprintf dans Visual Studio 2015. Sur les versions antérieures, vous pouvez le simuler comme ci-dessous.
Version longue :
Voici le comportement attendu de snprintf :
int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );
Écrit au maximum buf_size - 1
caractères dans une mémoire tampon. La chaîne de caractères La chaîne de caractères résultante sera terminée par un ch buf_size
est égal à zéro. Si buf_size
est égal à zéro, rien n'est écrit buffer
peut être un pointeur nul. La valeur de retour est le nombre de caractères qui auraient été écrits dans l'hypothèse d'une buf_size
, sans compter le caractère nul de fin.
Les versions antérieures à Visual Studio 2015 ne disposaient pas d'une implémentation conforme. Il existe à la place des extensions non standard telles que _snprintf()
(qui n'écrit pas de terminateur nul en cas de dépassement de capacité) et _snprintf_s()
(qui peut appliquer la terminaison nulle, mais renvoie -1 en cas de débordement au lieu du nombre de caractères qui auraient été écrits).
Solution de repli suggérée pour VS 2005 et les versions ultérieures :
#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