Dela via


snprintf, _snprintf, _snprintf_l, , , _snwprintf_snwprintf_l

Skriver formaterade data till en sträng. Säkrare versioner av dessa funktioner är tillgängliga. se _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l.

Syntax

int snprintf(
   char *buffer,
   size_t count,
   const char *format [,
   argument] ...
);

int _snprintf(
   char *buffer,
   size_t count,
   const char *format [,
   argument] ...
);

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

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

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

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

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

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

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

Parameterar

buffer
Lagringsplats för utdata.

count
Maximalt antal tecken att skriva. För de funktioner som tar wchar_tär det det maximala antalet breda tecken som ska skrivas.

format
Formatkontrollsträng.

argument
Valfria argument.

locale
Det språk som ska användas för att formatera utdata.

Mer information finns i Formatspecifikationssyntax: printf och wprintf funktioner.

Returvärde

Antalet tecken som skulle ha skrivits till bufferten om count de ignorerades. Antalet inkluderar inte det avslutande NULL tecknet.

Låt vara len längden på den formaterade datasträngen, inte inklusive avslutande NULL.
För alla funktioner, om len < count, len lagras tecken i buffer, läggs en null-terminator till och antalet tecken som skrivs, inklusive avslutande NULL, returneras.

De breda teckenversionerna av dessa funktioner returnerar antalet breda tecken som skrivits, inte inklusive avslutande NULL.

Mer information finns i Beteendesammanfattning .

Anmärkningar

Från och med UCRT i Visual Studio 2015 och Windows 10 snprintf är det inte längre identiskt _snprintfmed . Beteendet snprintf är nu C99 standardkonformt. Skillnaden är att om bufferten tar slut avslutar snprintf null slutet av bufferten och returnerar det antal tecken som skulle ha krävts, medan _snprintf inte null-avslutar bufferten och returnerar -1. _snprintf() Innehåller också ytterligare ett tecken i utdata eftersom det inte null-avslutar bufferten.

  • snprintf och serien _snprintf med funktioner formaterar och lagrar count eller färre tecken i buffer.
  • snprintf lagrar alltid ett avslutande NULL tecken och trunkerar utdata vid behov.
  • Om snprintf returnerar ett värde >count - 1 har utdata trunkerats.
  • Funktionsfamiljen _snprintf lägger bara till ett avslutande NULL tecken om den formaterade stränglängden är strikt mindre än count tecken.
  • 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. Om kopiering sker mellan strängar som överlappar varandra är beteendet odefinierat.

Beteendesammanfattning

För följande tabell:

  • Låt vara sizeOfBuffer storleken på buffer. Om funktionen tar en char buffert är storleken i byte. Om funktionen tar en wchar_t buffert anger storleken antalet 16-bitars ord.
  • Låt vara len storleken på de formaterade data. Om funktionen tar en char buffert är storleken i byte. Om funktionen tar en wchar_t buffert anger storleken antalet 16-bitars ord.
  • Tecken refererar till char tecken för funktioner som tar en char buffert och till wchar_t tecken för funktioner som tar en wchar_t buffert.
  • Mer information om den ogiltiga parameterhanteraren finns i Parameterverifiering.
Tillstånd Beteende Returvärde errno Anropar ogiltig parameterhanterare
Framgång Skriver tecknen till bufferten med den angivna formatsträngen. Antalet tecken som skrivits. Inte tillgänglig Nej
Kodningsfel under formatering Om bearbetningssträngsspecificeraren s, S, eller Z, slutar bearbeta formatspecifikationen placeras en NULL i början av bufferten. -1 EILSEQ (42) Nej
Kodningsfel under formatering Om bearbetningsteckenspecificeraren c eller C, hoppas det ogiltiga tecknet över. Antalet tecken som skrivs ökas inte för det överhoppade tecknet och inga data skrivs för det. Bearbetningen av formatspecifikationen fortsätter när du har hoppat över specificeraren med kodningsfelet. Antalet tecken som skrivs, inklusive avslutande NULL. EILSEQ (42) Nej
buffer == NULL och count != 0 Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. -1 EINVAL (22) Ja
count == 0 Antalet tecken som skulle ha skrivits, inklusive avslutande NULL. Du kan använda det här resultatet för att allokera tillräckligt med buffertutrymme för strängen och en avslutande NULL, och sedan anropa funktionen igen för att fylla bufferten. Inte tillgänglig Nej
count < 0 Osäkert: värdet behandlas som osignerat, vilket sannolikt skapar ett stort värde som resulterar i att minnet som följer bufferten skrivs över. Antalet tecken som skrivits Inte tillgänglig Nej
count < sizeOfBuffer och len <= count Alla data skrivs och en avslutande NULL läggs till. Antalet tecken som skrivs, inklusive avslutande NULL. Inte tillgänglig Nej
count < sizeOfBuffer och len > count De första count-1 tecknen skrivs följt av en null-terminator. Antalet tecken som skulle ha skrivits hade count matchat antalet tecken som ska matas ut, inklusive null-terminatorn. Inte tillgänglig Nej
count >= sizeOfBuffer och len < sizeOfBuffer Alla data skrivs med en avslutande NULL. Antalet tecken som skrivs, inklusive avslutande NULL. Inte tillgänglig Nej
count >= sizeOfBuffer och len >= sizeOfBuffer Osäkert: Skriver över minnet som följer bufferten. Antalet tecken som skrivs, inklusive avslutande NULL. Inte tillgänglig Nej
format == NULL Inga data skrivs. Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errno och returnerar ett negativt värde. -1 EINVAL (22) Ja

Information om dessa och andra felkoder finns i _doserrno, errno, _sys_errlistoch _sys_nerr.

Viktigt!

Kontrollera att det format inte är en användardefinierad sträng. _snprintf Eftersom funktionerna inte garanterar null-avslutning – särskilt när returvärdet är count– kontrollerar du att de följs av kod som lägger till null-avslutet. Mer information finns i Undvika buffertöverskridningar.

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.

_snwprintf är en bred teckenversion av _snprintf; pekarargumenten till _snwprintf är breda teckensträngar. Identifiering av kodningsfel i _snwprintf kan skilja sig från identifieringen i _snprintf. _snwprintf, precis som swprintf, skriver utdata till en sträng i stället för ett mål av typen FILE.

De versioner av dessa funktioner som har suffixet _l är identiska förutom att de använder språkparametern som skickas i stället för det aktuella trådspråket.

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

Allmän textrutinmappning

Tchar.h rutin _UNICODE och _MBCS inte definierad _MBCS definierad _UNICODE definierad
_sntprintf _snprintf _snprintf _snwprintf
_sntprintf_l _snprintf_l _snprintf_l _snwprintf_l

Kravspecifikation

Rutin Obligatoriskt huvud
snprintf, , _snprintf_snprintf_l <stdio.h>
_snwprintf, _snwprintf_l <stdio.h> eller <wchar.h>

Mer kompatibilitetsinformation finns i Kompatibilitet.

Exempel

// crt_snprintf.c
// compile with: /W3
#include <stdio.h>
#include <stdlib.h>

#if !defined(__cplusplus)
typedef int bool;
const bool true = 1;
const bool false = 0;
#endif

#define FAIL 0 // change to 1 and see what happens

int main(void)
{
   char buffer[200];
   const static char s[] = "computer"
#if FAIL
"computercomputercomputercomputercomputercomputercomputercomputer"
"computercomputercomputercomputercomputercomputercomputercomputer"
"computercomputercomputercomputercomputercomputercomputercomputer"
"computercomputercomputercomputercomputercomputercomputercomputer"
#endif
   ;
   const char c = 'l';
   const int i = 35;
#if FAIL
   const double fp = 1e300; // doesn't fit in the buffer
#else
   const double fp = 1.7320534;
#endif
   /* !subtract one to prevent "squeezing out" the terminal null! */
   const int bufferSize = sizeof(buffer)/sizeof(buffer[0]) - 1;
   int bufferUsed = 0;
   int bufferLeft = bufferSize - bufferUsed;
   bool bSuccess = true;
   buffer[0] = 0;

   /* Format and print various data: */

   if (bufferLeft > 0)
   {
      int perElementBufferUsed = _snprintf(&buffer[bufferUsed],
      bufferLeft, "   String: %s\n", s ); // C4996
      // Note: _snprintf is deprecated; consider _snprintf_s instead
      if (bSuccess = (perElementBufferUsed >= 0))
      {
         bufferUsed += perElementBufferUsed;
         bufferLeft -= perElementBufferUsed;
         if (bufferLeft > 0)
         {
            int perElementBufferUsed = _snprintf(&buffer[bufferUsed],
            bufferLeft, "   Character: %c\n", c ); // C4996
            if (bSuccess = (perElementBufferUsed >= 0))
            {
               bufferUsed += perElementBufferUsed;
               bufferLeft -= perElementBufferUsed;
               if (bufferLeft > 0)
               {
                  int perElementBufferUsed = _snprintf(&buffer
                  [bufferUsed], bufferLeft, "   Integer: %d\n", i ); // C4996
                  if (bSuccess = (perElementBufferUsed >= 0))
                  {
                     bufferUsed += perElementBufferUsed;
                     bufferLeft -= perElementBufferUsed;
                     if (bufferLeft > 0)
                     {
                        int perElementBufferUsed = _snprintf(&buffer
                        [bufferUsed], bufferLeft, "   Real: %f\n", fp ); // C4996
                        if (bSuccess = (perElementBufferUsed >= 0))
                        {
                           bufferUsed += perElementBufferUsed;
                        }
                     }
                  }
               }
            }
         }
      }
   }

   if (!bSuccess)
   {
      printf("%s\n", "failure");
   }
   else
   {
      /* !store null because _snprintf doesn't necessarily (if the string
       * fits without the terminal null, but not with it)!
       * bufferUsed might be as large as bufferSize, which normally is
       * like going one element beyond a buffer, but in this case
       * subtracted one from bufferSize, so we're ok.
       */
      buffer[bufferUsed] = 0;
      printf( "Output:\n%s\ncharacter count = %d\n", buffer, bufferUsed );
   }
   return EXIT_SUCCESS;
}
Output:
   String: computer
   Character: l
   Integer: 35
   Real: 1.732053

character count = 69

Se även

Strömma I/O
sprintf, _sprintf_l, swprintf, , , _swprintf_l__swprintf_l
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