Megosztás a következőn keresztül:


sprintf_s, _sprintf_s_l, swprintf_s_swprintf_s_l

Formázott adatok írása sztringbe. Ezek a függvények a , sprintf, _sprintf_l, swprintfverziójú_swprintf_l változatai, __swprintf_l a CRT biztonsági funkcióiban leírtak szerinti biztonsági fejlesztésekkel.

Szemantika

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

Paraméterek

buffer
A kimenet tárolási helye

sizeOfBuffer
Tárolandó karakterek maximális száma.

format
Formátumvezérlő sztring

...
Nem kötelező formázandó argumentumok

locale
A használni kívánt területi beállítás.

További információ: Formátumspecifikáció szintaxisa.

Visszaadott érték

Az írott karakterek száma, vagy hiba esetén -1. Ha buffer vagy null mutató, sprintf_s akkor swprintf_s adja vissza a -1 és állítsa be errno a következőreEINVAL: .format

sprintf_s A függvény a függvényben buffertárolt bájtok számát adja vissza, nem számítva a végződő null karaktert. swprintf_s A függvény a függvényben buffertárolt széles karakterek számát adja vissza, nem számítva a végződő null széles karaktert.

Megjegyzések

A sprintf_s függvény karakterek és értékek sorozatát formázja és tárolja a következőben buffer: . Mindegyik argument (ha van ilyen) konvertálása és kimenete a megfelelő formátumspecifikációnak megfelelően történik a következőben format: . A formátum egyszerű karakterekből áll, és az formatprintf argumentumával megegyező formában és függvénnyel rendelkezik. Az utolsó megírt karakter után null karakter lesz hozzáfűzve. Ha a másolás átfedésben lévő sztringek között történik, a viselkedés nincs meghatározva.

Az egyik fő különbség sprintf_ssprintf az, hogy a formázási sztring érvényes formázási karaktereket keres, míg sprintf csak azt ellenőrzi, hogy sprintf_s a formázási sztring vagy a puffer NULL mutató-e. Ha bármelyik ellenőrzés sikertelen, a rendszer meghívja az érvénytelen paraméterkezelőt a paraméterérvényesítésben leírtak szerint. Ha a végrehajtás folytatva van, a függvény -1 ad vissza, és a következőre állítja be errno : EINVAL.

A másik fő különbség sprintf_ssprintf az, hogy sprintf_s a kimeneti puffer méretét karakterben megadva egy hosszparamétert vesz igénybe. Ha a puffer túl kicsi a formázott szöveghez , beleértve a null végződést is, akkor a puffer üres sztringre van állítva úgy, hogy egy null karaktert buffer[0]helyez el, és a rendszer meghívja az érvénytelen paraméterkezelőt. Ellentétben _snprintfazzal, sprintf_s hogy a puffer null értékű lesz, kivéve, ha a puffer mérete nulla.

swprintf_s sprintf_sa(z) ; a mutató argumentumai swprintf_s széles karakterű sztringek. A kódolási hibák swprintf_s észlelése eltérhet az észleléstől sprintf_s. Ezeknek a függvényeknek az utótaggal ellátott _l verziói azonosak, azzal a különbséggel, hogy az aktuális szál területi beállítása helyett a területi paramétert használják.

A C++-ban ezeknek a függvényeknek a használatát a sablontúlterheltség leegyszerűsíti. A túlterhelések automatikusan kikövetkezhetik a puffer hosszát, ami szükségtelenné teszi a méretargumentum megadását. A régebbi, nem biztonságos függvényeket pedig automatikusan lecserélhetik újabb, biztonságosabb megfelelőkre. További információ: A sablon túlterhelésének biztonságossá tételéről.

Vannak olyan verziók sprintf_s , amelyek nagyobb mértékben szabályozják, hogy mi történik, ha a puffer túl kicsi. További információ: _snprintf_s, _snprintf_s_l, _snwprintf_s. _snwprintf_s_l

Fontos

A Windows 10 2004-es verziójától kezdve (19041-es build) a printf függvénycsalád pontosan ábrázolható lebegőpontos számokat nyomtat az IEEE 754 kerekítési szabályainak megfelelően. A Windows korábbi verzióiban az "5" végződésű lebegőpontos számok mindig felfelé kerekülnek. Az IEEE 754 szerint a legközelebbi páros számjegyre kell kerekíteniük (más néven "Banker kerekítése"). Például mindkettőt printf("%1.0f", 1.5) , és printf("%1.0f", 2.5) 2-re kell kerekítenie. Korábban az 1,5 2-et, a 2,5-öt pedig 3-ra kerekítené. Ez a változás csak a pontosan ábrázolható számokat érinti. Például a 2.35 (amely a memóriában ábrázolva közelebb van a 2.35000000000008-hoz) továbbra is 2,4-re kerekít. A függvények által végzett kerekítés mostantól a lebegőpontos kerekítési fesetroundmódot is figyelembe követi. Korábban a kerekítés mindig a viselkedést választotta FE_TONEAREST . Ez a módosítás csak a Visual Studio 2019 16.2-es és újabb verziójával készült programokat érinti. Az örökölt lebegőpontos kerekítési viselkedés használatához csatolja a legacy_stdio_float_rounding.obj.

Általános szöveges rutinleképezések

TCHAR. H rutin _UNICODE és _MBCS nincs definiálva _MBCS definiálva _UNICODE definiálva
_stprintf_s sprintf_s sprintf_s swprintf_s
_stprintf_s_l _sprintf_s_l _sprintf_s_l _swprintf_s_l

Követelmények

Rutin Kötelező fejléc
sprintf_s, _sprintf_s_l C: <stdio.h>

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

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

További kompatibilitási információkért lásd: Kompatibilitás.

Példa: Adatok formázása sprintf_s használatával

// 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

Példa: Hibakódkezelés

// 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

Lásd még

Stream I/O-
fprintf, _fprintf_l, fwprintf_fwprintf_l
printf, _printf_l, wprintf_wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l__swprintf_l
scanf, _scanf_l, wscanf_wscanf_l
sscanf, _sscanf_l, swscanf_swscanf_l
vprintf funkciók