Delen via


_snprintf_s,_snprintf_s_l,_snwprintf_s,_snwprintf_s_l

Hiermee schrijft u opgemaakte gegevens naar een tekenreeks. Deze functies zijn versies van snprintf, _snprintf, _snprintf_l, , , _snwprintf_snwprintf_l met beveiligingsverbeteringen die worden beschreven in beveiligingsfuncties in de CRT.

Syntaxis

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

Parameterwaarden

buffer
Opslaglocatie voor de uitvoer.

sizeOfBuffer
De grootte van de opslaglocatie voor uitvoer. Grootte in bytes voor de functies die nodig zijnchar, en woorden voor degenen die .wchar_t

count
Maximum aantal tekens dat moet worden geschreven. Voor de functies die nodig zijn wchar_t, is dit het maximum aantal tekens dat moet worden geschreven. Of _TRUNCATE.

format
Tekenreeks voor besturingselement opmaken.

argument
Optionele argumenten.

locale
De landinstelling die moet worden gebruikt.

Retourwaarde

Het aantal geschreven tekens, niet inclusief het eindteken NULL. Er wordt een negatieve waarde geretourneerd als er een uitvoerfout optreedt. Zie het gedragsoverzicht voor meer informatie.

Opmerkingen

De _snprintf_s functie formatteert en slaat count of minder tekens op buffer en voegt een eindteken NULLtoe. Elk argument (indien aanwezig) wordt geconverteerd en uitvoer volgens de bijbehorende indelingsspecificatie in format. De opmaak is consistent met de printf functiesfamilie. Zie syntaxis van indelingsspecificatie: printf en wprintf functies. Als kopiƫren plaatsvindt tussen tekenreeksen die overlappen, is het gedrag niet gedefinieerd.

Gedragsoverzicht

Voor de volgende tabel:

-Laat len de grootte van de opgemaakte gegevens zijn. Als de functie een char buffer gebruikt, is de grootte in bytes. Als de functie een wchar_t buffer gebruikt, geeft de grootte het aantal 16-bits woorden op.

  • Tekens verwijzen naar char tekens voor functies die een char buffer nemen en tekens wchar_t voor functies die een wchar_t buffer innemen.
  • Zie Parametervalidatie voor meer informatie over de ongeldige parameterhandler.
Conditie Gedrag Retourwaarde errno Roept een ongeldige parameterhandler aan
Geslaagd Schrijft de tekens naar de buffer met behulp van de opgegeven notatietekenreeks. Het aantal geschreven tekens, niet inclusief het eindteken NULL. Niet van toepassing. Nee.
Coderingsfout tijdens opmaak Als de verwerking van de tekenreeksspecificatie s, S, of Z, de indeling van de specificatie wordt gestopt. -1 EILSEQ (42) Nee.
Coderingsfout tijdens opmaak Als de tekenaanduiding c wordt verwerkt of Cals het ongeldige teken wordt overgeslagen. Het aantal geschreven tekens wordt niet verhoogd voor het overgeslagen teken en er zijn ook geen gegevens voor geschreven. Het verwerken van de indelingsspecificatie wordt voortgezet na het overslaan van de aanduiding met de coderingsfout. Het aantal geschreven tekens, niet inclusief het eindteken NULL. EILSEQ (42) Nee.
buffer == NULL en sizeOfBuffer == 0 en count == 0 Er worden geen gegevens geschreven. 0 Niet van toepassing. Nee.
buffer == NULL en hetzij sizeOfBuffer != 0 of count != 0 Als de uitvoering wordt voortgezet nadat de ongeldige parameterhandler is uitgevoerd, wordt een negatieve waarde ingesteld errno en geretourneerd. -1 EINVAL (22) Ja
buffer != NULL en sizeOfBuffer == 0 Er worden geen gegevens geschreven. -1 EINVAL (22) Ja
count == 0 A NULL wordt aan het begin van de buffer geplaatst. -1 Niet van toepassing. Nee.
count < 0 Onveilig: de waarde wordt behandeld als niet-ondertekend, waardoor waarschijnlijk een grote waarde ontstaat die resulteert in het overschrijven van het geheugen dat volgt op de buffer. Het aantal geschreven tekens, niet inclusief het eindteken NULL. Niet van toepassing. Nee.
count < sizeOfBuffer en len <= count Alle gegevens worden geschreven en er wordt een afsluitteken NULL toegevoegd. Het aantal geschreven tekens. Niet van toepassing. Nee.
count < sizeOfBuffer en len > count De eerste count tekens worden geschreven en er wordt een afsluitteken NULL toegevoegd. -1 Niet van toepassing. Nee.
count >= sizeOfBuffer en len < sizeOfBuffer Alle gegevens worden geschreven met een afsluit NULL. Het aantal geschreven tekens. Niet van toepassing. Nee.
count >= sizeOfBuffer en len >= sizeOfBuffer en count != _TRUNCATE Als de uitvoering doorgaat nadat de ongeldige parameterhandler is uitgevoerd, stelt errno, stelt buffer[0] == NULLin en retourneert een negatieve waarde. -1 ERANGE (34) Ja
count == _TRUNCATE en len >= sizeOfBuffer Schrijft zo veel van de tekenreeks als in buffer en een eindteken NULL. -1 Niet van toepassing. Nee.
count == _TRUNCATE en len < sizeOfBuffer Hiermee schrijft u de hele tekenreeks naar buffer met een eindteken NULL. Aantal geschreven tekens, niet inclusief het beƫindigen NULL. Niet van toepassing. Nee.
format == NULL Er worden geen gegevens geschreven. Als de uitvoering wordt voortgezet nadat de ongeldige parameterhandler is uitgevoerd, wordt een negatieve waarde ingesteld errno en geretourneerd. -1 EINVAL (22) Ja

Zie , _doserrno, en errno_sys_errlistvoor meer informatie over deze en andere foutcodes_sys_nerr .

Belangrijk

Zorg ervoor dat dit format geen door de gebruiker gedefinieerde tekenreeks is.

Vanaf Windows 10 versie 2004 (build 19041) drukt de printf reeks functies exact vertegenwoordigbare zwevende kommanummers af volgens de IEEE 754-regels voor afronding. In eerdere versies van Windows zouden de zwevende kommanummers die eindigen op '5' altijd naar boven afronden. IEEE 754 geeft aan dat ze moeten afronden op het dichtstbijzijnde even cijfer (ook wel bekend als 'Afronding van bankier'). Beide moeten bijvoorbeeld printf("%1.0f", 1.5)printf("%1.0f", 2.5) worden afgerond op 2. Voorheen zou 1,5 afronden op 2 en 2,5 naar 3. Deze wijziging is alleen van invloed op exact vertegenwoordigbare getallen. Bijvoorbeeld: 2.35 (die, wanneer deze wordt weergegeven in het geheugen, dichter bij 2.350000000000008) blijft afronden tot 2,4. Afronding die door deze functies wordt uitgevoerd, respecteert nu ook de drijvende-komma-afrondingsmodus die is ingesteld door fesetround. Eerder koos afronding altijd voor FE_TONEAREST gedrag. Deze wijziging is alleen van invloed op programma's die zijn gebouwd met Visual Studio 2019 versie 16.2 en hoger. Als u het verouderde drijvendekomma-afrondingsgedrag wilt gebruiken, moet u een koppeling maken met legacy_stdio_float_rounding.obj.

_snwprintf_s is een brede versie van _snprintf_s; de aanwijzerargumenten die _snwprintf_s tekenreeksen breed zijn. Detectie van coderingsfouten in _snwprintf_s kan afwijken van die in _snprintf_s. _snwprintf_s, zoals swprintf_s, schrijft uitvoer naar een tekenreeks in plaats van naar een bestemming van het type FILE.

De versies van deze functies met het _l achtervoegsel zijn identiek, behalve dat ze de locale-parameter gebruiken die wordt doorgegeven in plaats van de huidige thread-locale.

In C++ wordt het gebruik van deze functies vereenvoudigd door overbelasting van sjabloon; De overbelasting kan automatisch de bufferlengte afleiden (waardoor het niet meer nodig is om een grootteargument op te geven) en ze kunnen oudere, niet-beveiligde functies automatisch vervangen door hun nieuwere, veilige tegenhangers. Zie Overbelasting van beveiligde sjablonen voor meer informatie.

Algemene routinetoewijzingen voor tekst

Tchar.h routine _UNICODE en _MBCS niet gedefinieerd _MBCS Gedefinieerd _UNICODE Gedefinieerd
_sntprintf_s _snprintf_s _snprintf_s _snwprintf_s
_sntprintf_s_l _snprintf_s_l _snprintf_s_l _snwprintf_s_l

Behoeften

Routine Vereiste header
_snprintf_s, _snprintf_s_l <stdio.h>
_snwprintf_s, _snwprintf_s_l <stdio.h> of <wchar.h>

Zie Compatibiliteit voor meer compatibiliteitsinformatie.

Voorbeeld

// 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, size_t count )
{
   char dest[10];

   printf( "\n" );

   if ( count == _TRUNCATE )
      printf( "%zd-byte buffer; truncation semantics\n",
               _countof(dest) );
   else
      printf( "count = %zd; %zd-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();
}

count = 8; 10-byte buffer
    new contents of dest: '<<<121>>'

count = 9; 10-byte buffer
    new contents of dest: '<<<121>>>'

count = 10; 10-byte buffer
    new contents of dest: '<<<121>>>'

Destination buffer too small:

count = 10; 10-byte buffer
Invalid parameter handler invoked: ("Buffer too small", 0)
    new contents of dest: ''

Truncation examples:

10-byte buffer; truncation semantics
    new contents of dest: '<<<1221>>'
    truncation did occur

10-byte buffer; truncation semantics
    new contents of dest: '<<<121>>>'
    truncation did not occur

Secure template overload example:
Invalid parameter handler invoked: ("Buffer too small", 0)
    new contents of dest: ''

Zie ook

Stream I/O-
sprintf swprintf, _sprintf_l, _swprintf_l__swprintf_l
fprintf, , , _fprintf_lfwprintf_fwprintf_l
printf, , , _printf_lwprintf_wprintf_l
scanf, , , _scanf_lwscanf_wscanf_l
sscanf, , , _sscanf_lswscanf_swscanf_l
vprintf functies