Dela via


sprintf, _sprintf_l, swprintf, _swprintf, , , _swprintf_l__swprintf_l

Skriva formaterade data till en sträng. Det finns säkrare versioner av vissa av dessa funktioner. se sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l. De säkra versionerna av swprintf och _swprintf_l tar storleken på bufferten som en parameter.

Syntax

int sprintf(
   char *buffer,
   const char *format [,
   argument] ...
);

int _sprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale [,
   argument] ...
);

int swprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format [,
   argument]...
);

int _swprintf(
   wchar_t *buffer,
   const wchar_t *format [,
   argument]...
);

int _swprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);

int __swprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale [,
   argument] ...
);

template <size_t size>
int sprintf(
   char (&buffer)[size],
   const char *format [,
   argument] ...
); // C++ only

template <size_t size>
int _sprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale [,
   argument] ...
); // C++ only

Parameterar

buffer
Lagringsplats för utdata

count
Maximalt antal tecken som ska lagras i Unicode-versionen av den här funktionen.

format
Formatkontrollsträng

argument
Valfria argument

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 anropas den ogiltiga parameterhanteraren enligt beskrivningen i Parameterverifiering. Om körningen tillåts fortsätta returnerar dessa funktioner -1 och ställs in errnoEINVAL.

sprintf returnerar antalet byte som lagras i buffer, utan att räkna det avslutande null-tecknet. swprintf returnerar antalet breda tecken som lagras i buffer, utan att räkna det avslutande null-wide-tecknet.

Anmärkningar

Funktionen sprintf 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.

Viktigt!

Med hjälp sprintfav finns det inget sätt att begränsa antalet tecken som skrivs, vilket innebär att kod som använder sprintf är mottaglig för buffertöverskridningar. Överväg att använda den relaterade funktionen snprintf, som anger ett maximalt antal tecken att skriva till buffereller använda _scprintf för att avgöra hur stor buffert som krävs. Kontrollera också att det format inte är en användardefinierad sträng.

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.

swprintf är en bred teckenversion av sprintf; pekarargumenten till swprintf är breda teckensträngar. Identifiering av kodningsfel i swprintf kan skilja sig från sprintf. swprintf och fwprintf beter sig identiskt förutom swprintf skriver utdata till en sträng i stället för till ett mål av typen FILE, och swprintf kräver att parametern count anger det maximala antalet tecken som ska skrivas. Versionerna av dessa funktioner med suffixet _l är identiska, förutom att de använder språkparametern som skickas i stället för det aktuella trådspråket.

Innan signaturen för swprintf standardiserades levererades en version i ett äldre Microsoft C-körningsbibliotek som inte tog parametern teckenantal. Den äldre versionen är fortfarande tillgänglig i Microsoft C-körningsbiblioteket, men den är inaktuell och har bytt _swprintf()namn . För kod som skrevs mot den äldre signaturen definierar du _CRT_NON_CONFORMING_SWPRINTFS, som mappar anrop till swprintf ._swprintf I en framtida version kan det gamla beteendet tas bort, så koden bör ändras för att använda det nya konforma beteendet.

I C++ har dessa funktioner mallöverlagringar som anropar de nyare, säkra motsvarigheterna till dessa funktioner. För mer information, se Secure template overloads.

Allmän textrutinmappning

TCHAR.H rutin _UNICODE och _MBCS inte definierad _MBCS definierad _UNICODE definierad
_stprintf sprintf sprintf _swprintf
_stprintf_l _sprintf_l _sprintf_l __swprintf_l

Kravspecifikation

Rutin Obligatoriskt huvud
sprintf, _sprintf_l <stdio.h>
swprintf, , _swprintf_swprintf_l <stdio.h> eller <wchar.h>

Mer kompatibilitetsinformation finns i Kompatibilitet.

Exempel: Använd sprintf för att formatera data

// crt_sprintf.c
// compile with: /W3
// This program uses sprintf 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( buffer,     "   String:    %s\n", s ); // C4996
   j += sprintf( buffer + j, "   Character: %c\n", c ); // C4996
   j += sprintf( buffer + j, "   Integer:   %d\n", i ); // C4996
   j += sprintf( buffer + j, "   Real:      %f\n", fp );// C4996
   // Note: sprintf is deprecated; consider using sprintf_s instead

   printf( "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.c
// wide character example
// also demonstrates swprintf returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf 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
scanf, _scanf_l, , wscanf_wscanf_l
sscanf, _sscanf_l, , swscanf_swscanf_l
vprintf funktioner