Delen via


sprintf_s,_sprintf_s_l,swprintf_s,_swprintf_s_l

Opgemaakte gegevens naar een tekenreeks schrijven. Deze functies zijn versies van sprintf, _sprintf_l, swprintf, _swprintf_l, met __swprintf_l beveiligingsverbeteringen zoals beschreven in Beveiligingsfuncties in de CRT.

Syntaxis

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   ...
);
int _sprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   _locale_t locale,
   ...
);
int swprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   ...
);
int _swprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   _locale_t locale,
   ...
);
template <size_t size>
int sprintf_s(
   char (&buffer)[size],
   const char *format,
   ...
); // C++ only
template <size_t size>
int swprintf_s(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   ...
); // C++ only

Parameterwaarden

buffer
Opslaglocatie voor uitvoer

sizeOfBuffer
Maximum aantal tekens dat moet worden opgeslagen.

format
Tekenreeks voor besturingselement opmaken

...
Optionele argumenten die moeten worden opgemaakt

locale
De landinstelling die moet worden gebruikt.

Zie Specificatiesyntaxis opmaken voor meer informatie.

Retourwaarde

Het aantal geschreven tekens of -1 als er een fout is opgetreden. Als buffer of format een null-aanwijzer is en swprintf_ssprintf_s -1 retourneert en instelt errno op EINVAL.

sprintf_s retourneert het aantal bytes dat is opgeslagen in buffer, waarbij het null-teken voor het beëindigen niet wordt geteld. swprintf_s retourneert het aantal brede tekens dat is opgeslagen in buffer, waarbij het afsluitende null-brede teken niet wordt geteld.

Opmerkingen

De sprintf_s functie formatteert en slaat een reeks tekens en waarden op in buffer. Elke argument (indien aanwezig) wordt geconverteerd en uitvoer volgens de bijbehorende indelingsspecificatie in format. De notatie bestaat uit gewone tekens en heeft dezelfde vorm en functie als het argument format voor printf. Er wordt een null-teken toegevoegd nadat het laatste teken is geschreven. Als kopiëren plaatsvindt tussen tekenreeksen die overlappen, is het gedrag niet gedefinieerd.

Een belangrijk verschil tussen sprintf_s en sprintf is dat sprintf_s de notatietekenreeks wordt gecontroleerd op geldige opmaaktekens, terwijl sprintf alleen wordt gecontroleerd of de notatietekenreeks of buffer aanwijzers zijn NULL . Als een van beide controles mislukt, wordt de ongeldige parameterhandler aangeroepen, zoals beschreven in parametervalidatie. Als de uitvoering mag worden voortgezet, retourneert de functie -1 en wordt ingesteld errno op EINVAL.

Het andere belangrijkste verschil tussen sprintf_s en sprintf is dat er sprintf_s een lengteparameter nodig is die de grootte van de uitvoerbuffer in tekens aangeeft. Als de buffer te klein is voor de opgemaakte tekst, inclusief de afsluit-null, wordt de buffer ingesteld op een lege tekenreeks door een null-teken op buffer[0]te plaatsen en wordt de ongeldige parameterhandler aangeroepen. In tegenstelling tot _snprintf, sprintf_s garandeert u dat de buffer null-beëindigd wordt, tenzij de buffergrootte nul is.

swprintf_s is een brede versie van sprintf_s; de aanwijzerargumenten die swprintf_s tekenreeksen breed zijn. Detectie van coderingsfouten in swprintf_s kan afwijken van de detectie in sprintf_s. 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 sjablonen. De overbelastingen kunnen de bufferlengte automatisch afleiden, waardoor het niet meer nodig is om een grootteargument op te geven. En ze kunnen automatisch oudere, niet-beveiligde functies vervangen door nieuwere, veiligere tegenhangers. Zie Overbelasting van beveiligde sjablonen voor meer informatie.

Er zijn versies van sprintf_s die meer controle bieden over wat er gebeurt als de buffer te klein is. Zie , _snprintf_s, , voor _snprintf_s_l_snwprintf_smeer informatie_snwprintf_s_l.

Belangrijk

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.

Algemene routinetoewijzingen voor tekst

TCHAR. H-routine _UNICODE en _MBCS niet gedefinieerd _MBCS Gedefinieerd _UNICODE Gedefinieerd
_stprintf_s sprintf_s sprintf_s swprintf_s
_stprintf_s_l _sprintf_s_l _sprintf_s_l _swprintf_s_l

Behoeften

Routine Vereiste header
sprintf_s, _sprintf_s_l C: <stdio.h>

C++: <cstdio> of <stdio.h>
swprintf_s, _swprintf_s_l C: <stdio.h> of <wchar.h>

C++: <cstdio>, <cwchar>, <stdio.h> of <wchar.h>

Zie Compatibiliteit voor meer compatibiliteitsinformatie.

Voorbeeld: Sprintf_s gebruiken om gegevens op te maken

// crt_sprintf_s.c
// This program uses sprintf_s to format various
// data and place them in the string named buffer.
//

#include <stdio.h>

int main( void )
{
   char  buffer[200], s[] = "computer", c = 'l';
   int   i = 35, j;
   float fp = 1.7320534f;

   // Format and print various data:
   j  = sprintf_s( buffer, 200,     "   String:    %s\n", s );
   j += sprintf_s( buffer + j, 200 - j, "   Character: %c\n", c );
   j += sprintf_s( buffer + j, 200 - j, "   Integer:   %d\n", i );
   j += sprintf_s( buffer + j, 200 - j, "   Real:      %f\n", fp );

   printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
Output:
   String:    computer
   Character: l
   Integer:   35
   Real:      1.732053

character count = 79

Voorbeeld: Verwerking van foutcodes

// crt_swprintf_s.c
// wide character example
// also demonstrates swprintf_s returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf_s( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf_s fails because string contains WEOF (\xffff)
   printf( "wrote %d characters\n", len );
}
wrote 11 characters
wrote -1 characters

Zie ook

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