Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Skriva formaterade data till en sträng. Dessa funktioner är versioner av sprintf, _sprintf_l, swprintf, _swprintf_l__swprintf_l , med säkerhetsförbättringar som beskrivs i Säkerhetsfunktioner i CRT.
Syntax
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
Parameterar
buffer
Lagringsplats för utdata
sizeOfBuffer
Maximalt antal tecken att lagra.
format
Formatkontrollsträng
...
Valfria argument som ska formateras
locale
Språkvarianten som ska användas.
Mer information finns i Syntax för formatspecifikation.
Returvärde
Antalet tecken som skrivits eller -1 om ett fel uppstod. Om buffer eller format är en null-pekare sprintf_s returnerar swprintf_s du -1 och anger errno till EINVAL.
sprintf_s returnerar antalet byte som lagras i buffer, utan att räkna det avslutande null-tecknet.
swprintf_s returnerar antalet breda tecken som lagras i buffer, utan att räkna det avslutande null-wide-tecknet.
Anmärkningar
Funktionen sprintf_s formaterar och lagrar en serie tecken och värden i buffer. Varje argument (om någon) konverteras och utdata enligt motsvarande formatspecifikation i format. Formatet består av vanliga tecken och har samma formulär och funktion som argumentet format för printf. Ett null-tecken läggs till efter det sista tecknet som skrivits. Om kopiering sker mellan strängar som överlappar varandra är beteendet odefinierat.
En stor skillnad mellan sprintf_s och sprintf är att sprintf_s kontrollerar formatsträngen efter giltiga formateringstecken, medan sprintf endast kontrollerar om formatsträngen eller bufferten är NULL pekare. Om någon av kontroller misslyckas anropas den ogiltiga parameterhanteraren enligt beskrivningen i Parameterverifiering. Om körningen tillåts fortsätta returnerar funktionen -1 och anger errno till EINVAL.
Den andra största skillnaden mellan sprintf_s och sprintf är att sprintf_s tar en längdparameter som anger storleken på utdatabufferten i tecken. Om bufferten är för liten för den formaterade texten, inklusive avslutande null, ställs bufferten in på en tom sträng genom att ett null-tecken placeras på buffer[0]och den ogiltiga parameterhanteraren anropas. Till skillnad från _snprintfgaranterar garanterar sprintf_s att bufferten kommer att vara null-avslutad om inte buffertstorleken är noll.
swprintf_s är en bred teckenversion av sprintf_s; pekarargumenten till swprintf_s är breda teckensträngar. Identifiering av kodningsfel i swprintf_s kan skilja sig från identifieringen i sprintf_s. Versionerna av dessa funktioner med suffixet _l är identiska, förutom att de använder parametern locale som skickas i stället för den aktuella trådspråkinställningen.
I C++förenklas användningen av dessa funktioner av mallöverlagringar. Överlagringarna kan härleda buffertlängd automatiskt, vilket eliminerar behovet av att ange ett storleksargument. Och de kan automatiskt ersätta äldre, icke-säkra funktioner med nyare och säkrare motsvarigheter. För mer information, se Secure template overloads.
Det finns versioner av sprintf_s som ger mer kontroll över vad som händer om bufferten är för liten. Mer information finns i _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l.
Viktigt!
Från och med Windows 10 version 2004 (version 19041) skriver funktionsfamiljen printf ut exakt representerande flyttalsnummer enligt IEEE 754-reglerna för avrundning. I tidigare versioner av Windows skulle exakt representerande flyttalsnummer som slutar på "5" alltid avrunda uppåt. IEEE 754 anger att de måste avrunda till den närmaste jämna siffran (även kallat "Bankers avrundning"). Till exempel bör både printf("%1.0f", 1.5) och printf("%1.0f", 2.5) avrunda till 2. Tidigare skulle 1,5 avrunda till 2 och 2,5 skulle avrunda till 3. Den här ändringen påverkar endast exakt representerande tal. Till exempel fortsätter 2.35 (som, när det representeras i minnet, är närmare 2.3500000000000000008) att avrunda upp till 2,4. Avrundning som utförs av dessa funktioner respekterar nu också flyttalsrundningsläget som anges av fesetround. Tidigare valde FE_TONEAREST avrundning alltid beteende. Den här ändringen påverkar endast program som skapats med Visual Studio 2019 version 16.2 och senare. Om du vill använda det äldre avrundningsbeteendet för flyttalser länkar du till legacy_stdio_float_rounding.obj.
Allmän textrutinmappning
| TCHAR. H-rutin |
_UNICODE och _MBCS inte definierad |
_MBCS definierad |
_UNICODE definierad |
|---|---|---|---|
_stprintf_s |
sprintf_s |
sprintf_s |
swprintf_s |
_stprintf_s_l |
_sprintf_s_l |
_sprintf_s_l |
_swprintf_s_l |
Kravspecifikation
| Rutin | Obligatoriskt huvud |
|---|---|
sprintf_s, _sprintf_s_l |
C: <stdio.h> C++: <cstdio> eller <stdio.h> |
swprintf_s, _swprintf_s_l |
C: <stdio.h> eller <wchar.h> C++: <cstdio>, <cwchar>, <stdio.h> eller <wchar.h> |
Mer kompatibilitetsinformation finns i Kompatibilitet.
Exempel: Använd sprintf_s för att formatera data
// 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
Exempel: Felkodshantering
// 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
Se även
Strömma 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 funktioner