Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Écrivez une sortie formatée à l’aide d’un pointeur vers une liste d’arguments. Des versions plus sécurisées de ces fonctions sont disponibles ; voir vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l.
Syntaxe
int vsprintf(
char *buffer,
const char *format,
va_list argptr
);
int _vsprintf_l(
char *buffer,
const char *format,
_locale_t locale,
va_list argptr
);
int vswprintf(
wchar_t *buffer,
size_t count,
const wchar_t *format,
va_list argptr
);
int _vswprintf_l(
wchar_t *buffer,
size_t count,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
int __vswprintf_l(
wchar_t *buffer,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
template <size_t size>
int vsprintf(
char (&buffer)[size],
const char *format,
va_list argptr
); // C++ only
template <size_t size>
int _vsprintf_l(
char (&buffer)[size],
const char *format,
_locale_t locale,
va_list argptr
); // C++ only
template <size_t size>
int vswprintf(
wchar_t (&buffer)[size],
const wchar_t *format,
va_list argptr
); // C++ only
template <size_t size>
int _vswprintf_l(
wchar_t (&buffer)[size],
const wchar_t *format,
_locale_t locale,
va_list argptr
); // C++ only
Paramètres
buffer
Emplacement de stockage pour la sortie.
count
Nombre maximum de caractères à stocker, dans les versions à chaîne large de cette fonction.
format
Spécification du format.
argptr
Pointeur vers la liste des arguments.
locale
Locale à utiliser.
Valeur retournée
vsprintf et vswprintf renvoie le nombre de caractères écrits, sans compter le caractère de fin, NULL ou une valeur négative en cas d’erreur de sortie. S’il buffer s’agit d’un format pointeur, ces fonctions appellent le gestionnaire de paramètres non valide, comme décrit dans la section NULL. Si l’exécution est autorisée à se poursuivre, ces fonctions renvoient -1 et sont définies errno sur EINVAL.
If buffer est un NULL pointeur et count est égal à zéro, et vswprintf renvoie le nombre de caractères qui auraient été écrits, _vswprintf_l sans compter la valeur NULL de fin.
Si buffer est valide et count vaut zéro, vswprintf et _vswprintf_l renvoie -1. Le contenu de buffer est inchangé.
Pour plus d’informations sur ces codes d’erreur et d’autres, reportez-vous aux sections errno, _doserrno_sys_errlist, et _sys_nerr.
Remarques
Chacune de ces fonctions prend un pointeur vers une liste d’arguments, puis formate et écrit les données données données dans la mémoire pointée par buffer.
Les versions de ces fonctions avec le _l suffixe sont identiques, sauf qu’elles utilisent le paramètre locale passé à la place de la locale du thread actuel.
Important
En utilisant vsprintf, il n’y a aucun moyen de limiter le nombre de caractères écrits, ce qui signifie que le code utilisant cette fonction est susceptible de dépassement de la mémoire tampon. Utilisez _vsnprintf plutôt ou appelez _vscprintf pour déterminer la taille d’une mémoire tampon nécessaire. Assurez-vous également qu’il ne s’agit format pas d’une chaîne définie par l’utilisateur. Pour plus d’informations, consultez Solutions contre les dépassements de mémoire tampon.
À partir de Windows 10 version 2004 (build 19041), la printf famille de fonctions imprime des nombres à virgule flottante exactement représentables selon les règles d’arrondi IEEE 754. Dans les versions précédentes de Windows, les nombres à virgule flottante se terminant par « 5 » étaient toujours arrondis à la hausse. L’IEEE 754 stipule qu’ils doivent arrondir au chiffre pair le plus proche (également connu sous le nom d'« arrondi du banquier »). Par exemple, les deux printf("%1.0f", 1.5) et printf("%1.0f", 2.5) doivent être arrondis à 2. Auparavant, 1,5 s’arrondissait à 2 et 2,5 à 3. Ce changement n’affecte que les numéros exactement représentables. Par exemple, 2,35 (qui, lorsqu’il est représenté en mémoire, est plus proche de 2,350000000000008) continue d’arrondir à 2,4. L’arrondi effectué par ces fonctions respecte désormais également le mode d’arrondi en virgule flottante défini par fesetround. Auparavant, l’arrondi choisissait toujours le FE_TONEAREST comportement. Cette modification affecte uniquement les programmes créés à l’aide de Visual Studio 2019 version 16.2 et ultérieure. Pour utiliser le comportement d’arrondi à virgule flottante héritée, liez avec legacy_stdio_float_rounding.obj.
vswprintf est conforme à la norme ISO C, qui exige le deuxième paramètre, count, de type size_t. Pour forcer l’ancien comportement non standard, définissez _CRT_NON_CONFORMING_SWPRINTFS. L’ancien comportement peut ne pas être dans une version ultérieure, le code doit donc être modifié pour utiliser le nouveau comportement conforme.
En C++, ces fonctions ont des surcharges de modèle qui appellent les homologues plus récents et sécurisés de ces fonctions. Pour plus d'informations, consultez Sécuriser les surcharges de modèle.
Mappages de routines de texte générique
Routine TCHAR.H |
_UNICODE et _MBCS non définis |
_MBCS défini |
_UNICODE défini |
|---|---|---|---|
_vstprintf |
vsprintf |
vsprintf |
vswprintf |
_vstprintf_l |
_vsprintf_l |
_vsprintf_l |
_vswprintf_l |
Spécifications
| Routine | En-tête requis | En-têtes facultatifs |
|---|---|---|
vsprintf, _vsprintf_l |
<stdio.h> et <stdarg.h> |
<varargs.h>* |
vswprintf, _vswprintf_l |
<stdio.h> ou <wchar.h>, et <stdarg.h> |
<varargs.h>* |
* Requis pour la compatibilité UNIX V.
Pour plus d’informations de compatibilité, consultez Compatibilité.
Exemple :
// crt_vsprintf.c
// compile with: cl /W4 crt_vsprintf.c
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void test( char const * const format, ... )
{
va_list args;
int len;
char *buffer;
// retrieve the variable arguments
va_start( args, format );
len = _vscprintf( format, args ) // _vscprintf doesn't count
+ 1; // terminating '\0'
buffer = (char*)malloc( len * sizeof(char) );
if ( 0 != buffer )
{
vsprintf( buffer, format, args ); // C4996
// Note: vsprintf is deprecated; consider using vsprintf_s instead
puts( buffer );
free( buffer );
}
va_end( args );
}
int main( void )
{
test( "%d %c %d", 123, '<', 456 );
test( "%s", "This is a string" );
}
123 < 456
This is a string
Voir aussi
E/S de flux
vprintf fonctions
Spécification de format, printf syntaxe : et wprintf fonctions
fprintf, , _fprintf_lfwprintf, ,_fwprintf_l
printf, , _printf_lwprintf, ,_wprintf_l
sprintf, _sprintf_l, , swprintf, _swprintf_l, __swprintf_l
va_arg, , va_copyva_end, ,va_start