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.
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.
- 
              snprintfoch serien_snprintfmed funktioner formaterar och lagrarcounteller färre tecken ibuffer.
- 
              snprintflagrar alltid ett avslutandeNULLtecken och trunkerar utdata vid behov.
- Om snprintfreturnerar ett värde >count- 1 har utdata trunkerats.
- Funktionsfamiljen _snprintflägger bara till ett avslutandeNULLtecken om den formaterade stränglängden är strikt mindre äncounttecken.
- Varje argument(om någon) konverteras och utdata enligt motsvarande formatspecifikation iformat. Formatet består av vanliga tecken och har samma formulär och funktion som argumentetformatförprintf. Om kopiering sker mellan strängar som överlappar varandra är beteendet odefinierat.
Beteendesammanfattning
För följande tabell:
- Låt vara sizeOfBufferstorleken påbuffer. Om funktionen tar encharbuffert är storleken i byte. Om funktionen tar enwchar_tbuffert anger storleken antalet 16-bitars ord.
- Låt vara lenstorleken på de formaterade data. Om funktionen tar encharbuffert är storleken i byte. Om funktionen tar enwchar_tbuffert anger storleken antalet 16-bitars ord.
- Tecken refererar till chartecken för funktioner som tar encharbuffert och tillwchar_ttecken för funktioner som tar enwchar_tbuffert.
- 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, ellerZ, slutar bearbeta formatspecifikationen placeras enNULLi början av bufferten. | -1 | EILSEQ(42) | Nej | 
| Kodningsfel under formatering | Om bearbetningsteckenspecificeraren cellerC, 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 == NULLochcount != 0 | Om körningen fortsätter efter att den ogiltiga parameterhanteraren har körts anger errnooch 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 avslutandeNULL, 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 < sizeOfBufferochlen <= count | Alla data skrivs och en avslutande NULLläggs till. | Antalet tecken som skrivs, inklusive avslutande NULL. | Inte tillgänglig | Nej | 
| count < sizeOfBufferochlen > count | De första count-1tecknen skrivs följt av en null-terminator. | Antalet tecken som skulle ha skrivits hade countmatchat antalet tecken som ska matas ut, inklusive null-terminatorn. | Inte tillgänglig | Nej | 
| count >= sizeOfBufferochlen < sizeOfBuffer | Alla data skrivs med en avslutande NULL. | Antalet tecken som skrivs, inklusive avslutande NULL. | Inte tillgänglig | Nej | 
| count >= sizeOfBufferochlen >= 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 errnooch 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.hrutin | _UNICODEoch_MBCSinte definierad | _MBCSdefinierad | _UNICODEdefinierad | 
|---|---|---|---|
| _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