Condividi tramite


_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l

Writes formattata i dati in una stringa.queste sono versioni di _snprintf, _snprintf_l, _snwprintf, _snwprintf_l con i miglioramenti della sicurezza come descritto in Funzionalità di sicurezza in CRT.

int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format [,
   argument] ... 
);
int _snprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   locale_t locale [,
   argument] ... 
);
int _snwprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format [,
   argument] ... 
);
int _snwprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format,
   locale_t locale [,
   argument] ... 
);
template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
   argument] ... 
); // C++ only
template <size_t size>
int _snwprintf_s(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format [,
   argument] ... 
); // C++ only

Parametri

  • buffer
    percorso di archiviazione per l'output.

  • sizeOfBuffer
    La dimensione del percorso di archiviazione per l'output.Dimensione in bytes per _snprintf_s o dimensione in words per _snwprintf_s.

  • Count
    Numero massimo di caratteri da archiviare, o _TRUNCATE.

  • format
    stringa del Formato-controllo.

  • argument
    argomenti facoltativi.

  • locale
    le impostazioni locali da utilizzare.

Valore restituito

_snprintf_s restituisce il numero di caratteri archiviato in buffer, non calcola il carattere di terminazione null._snwprintf_s restituisce il numero di caratteri di tipo " wide " archiviati in buffer, non calcola il carattere di tipo " wide " di terminazione null.

Se la memoria per archiviare i dati e un percorso di terminazione null sizeOfBuffer, il gestore non valido di parametro viene richiamato, come descritto in Convalida dei parametri.Se l'esecuzione continua dopo il gestore non valido di parametro, queste funzioni impostate buffer su una stringa vuota, set errno in ERANGEe restituiscono -1.

se buffer o format è un oggetto NULL puntatore, o se count è minore o uguale a zero, il gestore non valido di parametro viene richiamato.Se l'esecuzione è consentita per continuare, queste funzioni impostate errno in EINVAL e restituiscono -1.

Per informazioni su questi e altri codici di errore, vedere _doserrno, errno, _sys_errlist e _sys_nerr.

Note

_snprintf_s formatta e archivi di funzione count o meno caratteri in buffer e viene aggiunto di terminazione null.Ogni argomento (se presenti) viene convertito e restituito in base alla specifica di formato corrispondente in format.la formattazione è coerente con printf famiglia di funzioni, vedere Sintassi per la specifica del formato: funzioni printf wprintf.Se copiare si verifica tra stringhe che si sovrappongono, il comportamento sarà indefinito.

se count viene _TRUNCATE, quindi _snprintf_s scrive da parte della stringa come è sufficiente per vedere buffer mentre lasciare spazio per un di terminazione null.Se l'intera stringa (con null di terminazione) si concordi buffer, quindi _snprintf_s restituisce il numero di caratteri scritto (escluso il di terminazione null); in caso contrario, _snprintf_s restituisce -1 per indicare che il troncamento si è verificato.

Nota sulla sicurezzaNota sulla sicurezza

Assicurarsi che format non è una stringa definita dall'utente.

_snwprintf_s è una versione a caratteri estesi di _snprintf_s; gli argomenti del puntatore su _snwprintf_s sono le stringhe di caratteri estesi.Rilevamento degli errori di codifica in _snwprintf_s potrebbe non corrispondere a quello di _snprintf_s._snwprintf_s, ad esempio swprintf_s, scrivere l'output in una stringa anziché una destinazione di tipo FILE.

le versioni di queste funzioni con _l il suffisso è identico con la differenza che utilizzano il parametro delle impostazioni locali passato alle impostazioni locali del thread corrente.

In C++, utilizzando queste funzioni è semplificato dagli overload del modello; gli overload possono dedurre la lunghezza del buffer automaticamente (che elimina la necessità di specificare un argomento di dimensione) e possono sostituire automaticamente le funzioni precedenti e non sicure con le più recenti, controparti sicure.Per ulteriori informazioni, vedere Assicurarsi che gli overload del modello.

Mapping di routine a testo generico

routine di Tchar.h

_UNICODE e _MBCS non definiti

_MBCS definito

_UNICODE definito

_sntprintf_s

_snprintf_s

_snprintf_s

_snwprintf_s

_sntprintf_s_l

_snprintf_s_l

_snprintf_s_l

_snwprintf_s_l

Requisiti

routine

Intestazione di associazione

_snprintf_s, _snprintf_s_l

<stdio.h>

_snwprintf_s, _snwprintf_s_l

<stdio.h> o <wchar.h>

Per ulteriori informazioni sulla compatibilità, vedere compatibilità nell'introduzione.

Esempio

// crt_snprintf_s.cpp
// compile with: /MTd

// These #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h>  // For _CrtSetReportMode
#include <errno.h>

// This example uses a 10-byte destination buffer.

int snprintf_s_tester( const char * fmt, int x, int count )
{
   char dest[10];

   printf( "\n" );

   if ( count == _TRUNCATE )
      printf( "%d-byte buffer; truncation semantics\n",
               _countof(dest) );
   else
      printf( "count = %d; %d-byte buffer\n",
               count, _countof(dest) );

   int ret = _snprintf_s( dest, _countof(dest), count, fmt, x );

   printf( "    new contents of dest: '%s'\n", dest );

   return ret;
}


void Examples()
{
   // formatted output string is 9 characters long: "<<<123>>>"
   snprintf_s_tester( "<<<%d>>>", 121, 8 );
   snprintf_s_tester( "<<<%d>>>", 121, 9 );
   snprintf_s_tester( "<<<%d>>>", 121, 10 );

   printf( "\nDestination buffer too small:\n" );

   snprintf_s_tester( "<<<%d>>>", 1221, 10 );

   printf( "\nTruncation examples:\n" );

   int ret = snprintf_s_tester( "<<<%d>>>", 1221, _TRUNCATE );
   printf( "    truncation %s occur\n", ret == -1 ? "did"
                                                  : "did not" );

   ret = snprintf_s_tester( "<<<%d>>>", 121, _TRUNCATE );
   printf( "    truncation %s occur\n", ret == -1 ? "did"
                                                  : "did not" );
   printf( "\nSecure template overload example:\n" );

   char dest[10];
   _snprintf( dest, 10, "<<<%d>>>", 12321 );
   // With secure template overloads enabled (see #defines
   // at top of file), the preceding line is replaced by
   //    _snprintf_s( dest, _countof(dest), 10, "<<<%d>>>", 12345 );
   // Instead of causing a buffer overrun, _snprintf_s invokes
   // the invalid parameter handler.
   // If secure template overloads were disabled, _snprintf would
   // write 10 characters and overrun the dest buffer.
   printf( "    new contents of dest: '%s'\n", dest );
}

void myInvalidParameterHandler(
   const wchar_t* expression,
   const wchar_t* function, 
   const wchar_t* file, 
   unsigned int line, 
   uintptr_t pReserved)
{
   wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}

int main( void )
{
   _invalid_parameter_handler oldHandler, newHandler;

   newHandler = myInvalidParameterHandler;
   oldHandler = _set_invalid_parameter_handler(newHandler);
   // Disable the message box for assertions.
   _CrtSetReportMode(_CRT_ASSERT, 0);

   Examples();
}
  

Equivalente .NET Framework

Non applicabile. Per chiamare la funzione c standard, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di pinvoke.

Vedere anche

Riferimenti

Flusso I/O

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

funzioni di vprintf