vsprintf_s
, _vsprintf_s_l
, vswprintf_s
, _vswprintf_s_l
Scrivere l'output formattato mediante un puntatore a un elenco di argomenti. Queste funzioni sono versioni di vsprintf
, _vsprintf_l
vswprintf
, _vswprintf_l
'__vswprintf_l' con miglioramenti della sicurezza, come descritto in Funzionalità di sicurezza in CRT.
Sintassi
int vsprintf_s(
char *buffer,
size_t numberOfElements,
const char *format,
va_list argptr
);
int _vsprintf_s_l(
char *buffer,
size_t numberOfElements,
const char *format,
_locale_t locale,
va_list argptr
);
int vswprintf_s(
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *format,
va_list argptr
);
int _vswprintf_s_l(
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *format,
_locale_t locale,
va_list argptr
);
template <size_t size>
int vsprintf_s(
char (&buffer)[size],
const char *format,
va_list argptr
); // C++ only
template <size_t size>
int vswprintf_s(
wchar_t (&buffer)[size],
const wchar_t *format,
va_list argptr
); // C++ only
Parametri
buffer
Percorso di archiviazione per l'output.
numberOfElements
Dimensioni di buffer
in caratteri.
format
Specifica di formato.
argptr
Puntatore a un elenco di argomenti.
locale
Impostazioni locali da usare.
Valore restituito
vsprintf_s
e vswprintf_s
restituiscono il numero di caratteri scritti, escludendo il carattere Null di terminazione, o un valore negativo se si verifica un errore di output. Se buffer
o format
è un puntatore Null, se numberOfElements
è zero o se la stringa di formato contiene caratteri di formattazione non validi, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, le funzioni restituiranno -1 e imposteranno errno
su EINVAL
.
Per informazioni su questi e altri codici di errore, vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Osservazioni:
Ognuna di queste funzioni accetta un puntatore a un elenco di argomenti, quindi formatta e scrive i dati specifici nella memoria a cui punta buffer
.
vswprintf_s
è conforme allo standard ISO C per vswprintf
che richiede il secondo parametro, count
, di tipo size_t
.
Queste funzioni differiscono dalle versioni non sicure solo nel fatto che le versioni sicure supportano i parametri posizionali. Per altre informazioni, vedere printf_p
Parametri posizionali.
Le versioni di queste funzioni con il suffisso _l
sono identiche ad eccezione per il fatto che utilizzano il parametro delle impostazioni locali passato al posto di quelle del thread corrente.
In C++, l'uso di queste funzioni è semplificato dagli overload dei modelli. Gli overload possono dedurre automaticamente la lunghezza del buffer, eliminando la necessità di specificare un argomento size. E possono sostituire automaticamente funzioni non sicure con le controparti sicure. Per altre informazioni, vedere Proteggere gli overload dei modelli.
Importante
A partire da Windows 10 versione 2004 (build 19041), la printf
famiglia di funzioni stampa esattamente numeri a virgola mobile rappresentabili in base alle regole I edizione Enterprise E 754 per l'arrotondamento. Nelle versioni precedenti di Windows, i numeri a virgola mobile che terminano in '5' verrebbero sempre arrotondati. I edizione Enterprise E 754 indica che devono arrotondare alla cifra pari più vicina (nota anche come "Arrotondamento del banchiere"). Ad esempio, sia printf("%1.0f", 1.5)
che printf("%1.0f", 2.5)
devono essere arrotondati a 2. In precedenza, 1,5 arrotonderebbe a 2 e 2,5 arrotonderebbe a 3. Questa modifica influisce solo sui numeri rappresentabili esattamente. Ad esempio, 2.35 (che, se rappresentato in memoria, è più vicino a 2,350000000000000008) continua a arrotondare fino a 2,4. L'arrotondamento eseguito da queste funzioni ora rispetta anche la modalità di arrotondamento a virgola mobile impostata da fesetround
. In precedenza, l'arrotondamento ha sempre scelto FE_TONEAREST
il comportamento. Questa modifica interessa solo i programmi compilati con Visual Studio 2019 versione 16.2 e successive. Per usare il comportamento di arrotondamento a virgola mobile legacy, collegarsi a "legacy_stdio_float_rounding.obj".
Mapping di routine di testo generico
TCHAR.H Routine |
_UNICODE e _MBCS non definito |
_MBCS Definito |
_UNICODE Definito |
---|---|---|---|
_vstprintf_s |
vsprintf_s |
vsprintf_s |
vswprintf_s |
_vstprintf_s_l |
_vsprintf_s_l |
_vsprintf_s_l |
_vswprintf_s_l |
Requisiti
Ciclo | Intestazione obbligatoria | Intestazioni facoltative |
---|---|---|
vsprintf_s , _vsprintf_s_l |
<stdio.h> e <stdarg.h> |
<varargs.h>* |
vswprintf_s , _vswprintf_s_l |
<stdio.h> o <wchar.h> , e <stdarg.h> |
<varargs.h>* |
* Obbligatorio per la compatibilità di UNIX V.
Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).
Esempio
// crt_vsprintf_s.c
// Compile with: cl /W4 crt_vsprintf_s.c
// This program uses vsprintf_s to write to a buffer.
// The size of the buffer is determined by _vscprintf.
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
void test( char const * const format, ... )
{
va_list args;
int len;
char * buffer;
va_start( args, format );
len = _vscprintf( format, args ) // _vscprintf doesn't count
+ 1; // terminating '\0'
buffer = (char *) malloc( len * sizeof(char) );
if ( NULL != buffer )
{
vsprintf_s( buffer, len, format, args );
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
Vedi anche
I/O di flusso
Funzioni vprintf
Sintassi della specifica del formato: printf
e wprintf
funzioni
fprintf
, _fprintf_l
, fwprintf
, _fwprintf_l
printf
, _printf_l
, wprintf
, _wprintf_l
sprintf
, _sprintf_l
, swprintf
, _swprintf_l
, __swprintf_l
va_arg
, va_copy
, va_end
, va_start
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per