Aracılığıyla paylaş


snprintf, _snprintf, _snprintf_l, _snwprintf, , _snwprintf_l

Biçimlendirilmiş verileri bir dizeye yazar. Bu işlevlerin daha güvenli sürümleri mevcuttur; bkz. _snprintf_s, _snprintf_s_l, _snwprintf_s. _snwprintf_s_l

Sözdizimi

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

Parametreler

buffer
Çıktı için depolama konumu.

count
Yazacak karakter sayısı üst sınırı. öğesini alan wchar_tişlevler için, yazacak en fazla geniş karakter sayısıdır.

format
Biçim denetimi dizesi.

argument
İsteğe bağlı bağımsız değişkenler.

locale
Çıkışı biçimlendirmek için kullanılacak yerel ayar.

Daha fazla bilgi için bkz . Biçim belirtimi söz dizimi: printf ve wprintf işlevleri.

Dönüş değeri

Yoksayılırsa count arabelleğe yazabilecek karakter sayısı. Sayı sonlandırıcı NULL karakteri içermez.

Sonlandırıcı NULLdahil olmak üzere biçimlendirilmiş veri dizesinin uzunluğu olsunlen.
Tüm işlevler için, ise len < countlen karakterler içinde bufferdepolanır, bir null sonlandırıcı eklenir ve sonlandırıcı NULLdahil olmak üzere yazılmayan karakter sayısı döndürülür.

Bu işlevlerin geniş karakter sürümleri, sonlandırıcı NULLdahil olmak üzere yazılmış geniş karakter sayısını döndürür.

Ayrıntılar için bkz . Davranış özeti .

Açıklamalar

Visual Studio 2015 ve Windows 10'daki UCRT ile başlayarak, snprintf artık ile _snprintfaynı değildir. Bu snprintf davranış artık C99 standardına uygundur. Aradaki fark, arabelleğiniz biterse arabelleğin snprintf sonunu null-sonlandırır ve gerekli olabilecek karakter sayısını döndürürken _snprintf arabelleği null olarak sonlandırmaz ve -1 döndürür. Ayrıca, snprintf() arabelleği null olarak sonlandırmadığından çıkışa bir karakter daha ekler.

  • snprintf_snprintf ve işlev ailesi, içinde biçimlendirip veya daha az karakter depolarbuffercount.
  • snprintf her zaman sonlandırıcı bir karakter depolar NULL ve gerekirse çıkışı kesilir.
  • - 1 değerini >count döndürürsesnprintf, çıkış kesilir.
  • İşlev _snprintf ailesi yalnızca biçimlendirilmiş dize uzunluğu karakterden count daha azsa sonlandırıcı NULL bir karakter ekler.
  • Her argument (varsa) dönüştürülür ve içindeki formatilgili biçim belirtimine göre çıkıştır. Biçim sıradan karakterlerden oluşur ve için printfbağımsız değişkenle aynı biçime ve işleve format sahiptir. Çakışan dizeler arasında kopyalama olursa davranış tanımsızdır.

Davranış özeti

Aşağıdaki tablo için:

  • boyutunun bufferolması gerekirsizeOfBuffer. İşlev bir char arabellek alırsa boyut bayt cinsindendir. İşlev bir wchar_t arabellek alırsa, boyut 16 bit sözcük sayısını belirtir.
  • len Biçimlendirilmiş verilerin boyutu olsun. İşlev bir char arabellek alırsa boyut bayt cinsindendir. İşlev bir wchar_t arabellek alırsa, boyut 16 bit sözcük sayısını belirtir.
  • Karakterler, arabelleğe alınan char işlevlerin karakterlerine wchar_t ve arabelleğe alınan wchar_t işlevlere yönelik karakterlere başvururchar.
  • Geçersiz parametre işleyicisi hakkında daha fazla bilgi için bkz . Parametre Doğrulama.
Koşul Davranış Dönüş değeri errno Geçersiz parametre işleyicisini çağırır
Başarılı Belirtilen biçim dizesini kullanarak karakterleri arabelleğe yazar. Yazılan karakter sayısı. Yok Hayır
Biçimlendirme sırasında kodlama hatası Dize tanımlayıcısı s, , Sveya Z, biçim belirtimi işleme durdurulursa, arabelleğin başına bir NULL yerleştirilir. -1 EILSEQ (42) Hayır
Biçimlendirme sırasında kodlama hatası Karakter tanımlayıcısı c veya Cişleniyorsa geçersiz karakter atlanır. Yazılan karakter sayısı, atlanan karakter için artırılmıyor ve bu karakter için yazılan veri yok. Biçim belirtimi işleme, tanımlayıcıyı kodlama hatasıyla atladıktan sonra devam eder. Sonlandırıcı NULLdahil değil, yazılan karakter sayısı. EILSEQ (42) Hayır
buffer == NULL ve count != 0 Geçersiz parametre işleyicisi yürütülürken yürütme devam ederse, negatif bir değer ayarlar errno ve döndürür. -1 EINVAL (22) Yes
count == 0 Sonlandırıcı NULLdahil olmak üzere yazılabilecek karakter sayısı. Dize ve sonlandırıcı NULLiçin yeterli arabellek alanı ayırmak ve ardından arabelleği doldurmak için işlevi yeniden çağırmak için bu sonucu kullanabilirsiniz. Yok Hayır
count < 0 Güvenli değil: değer işaretsiz olarak kabul edilir ve büyük olasılıkla arabelleğinden sonra gelen belleğin üzerine yazılmasıyla sonuçlanan büyük bir değer oluşturur. Yazılan karakter sayısı Yok Hayır
count < sizeOfBuffer ve len <= count Tüm veriler yazılır ve sonlandırıcı NULL eklenir. Sonlandırıcı NULLdahil değil, yazılan karakter sayısı. Yok Hayır
count < sizeOfBuffer ve len > count İlk count-1 karakterlerin ardından null-terminator yazılır. Yazılmış olabilecek karakter sayısı, null sonlandırıcı dahil olmak üzere çıkış için karakter sayısıyla eşleşmişti count . Yok Hayır
count >= sizeOfBuffer ve len < sizeOfBuffer Tüm veriler sonlandırıcı NULLile yazılır. Sonlandırıcı NULLdahil değil, yazılan karakter sayısı. Yok Hayır
count >= sizeOfBuffer ve len >= sizeOfBuffer Güvenli değil: Arabelleği izleyen belleğin üzerine yazar. Sonlandırıcı NULLdahil değil, yazılan karakter sayısı. Yok Hayır
format == NULL Hiçbir veri yazılmıştır. Geçersiz parametre işleyicisi yürütülürken yürütme devam ederse, negatif bir değer ayarlar errno ve döndürür. -1 EINVAL (22) Yes

Bunlar ve diğer hata kodları hakkında bilgi için bkz. _doserrno, errno, _sys_errlistve _sys_nerr.

Önemli

format Kullanıcı tanımlı bir dize olmadığından emin olun. İşlevler null sonlandırmayı _snprintf garanti etmediğinden (özellikle, dönüş değeri countolduğunda), bunların ardından null sonlandırıcıyı ekleyen kodlar geldiğinden emin olun. Daha fazla bilgi için bkz . Arabellek taşmalarından kaçınma.

Windows 10 sürüm 2004 'den (derleme 19041) printf başlayarak, işlev ailesi yuvarlama için IEEE 754 kurallarına göre tam olarak temsil edilebilir kayan nokta numaraları yazdırır. Windows'un önceki sürümlerinde, '5' ile biten tam olarak temsil edilebilir kayan nokta sayıları her zaman yukarı yuvarlanırdı. IEEE 754, en yakın çift rakama ("Bankacı Yuvarlama" olarak da bilinir) yuvarlamaları gerektiğini belirtir. Örneğin, hem hem de printf("%1.0f", 1.5) printf("%1.0f", 2.5) 2'ye yuvarlanmalıdır. Daha önce 1,5 2'ye, 2,5 ise 3'e yuvarlardı. Bu değişiklik yalnızca tam olarak temsil edilebilir sayıları etkiler. Örneğin, 2,35 (bellekte temsil edildiğinde 2,3500000000000000000008'e daha yakındır) 2,4'e kadar yuvarlanmaya devam eder. Bu işlevler tarafından yapılan yuvarlama artık tarafından fesetroundayarlanan kayan nokta yuvarlama moduna da dikkat eder. Daha önce yuvarlama her zaman davranışı seçmişti FE_TONEAREST . Bu değişiklik yalnızca Visual Studio 2019 sürüm 16.2 ve üzeri kullanılarak oluşturulan programları etkiler. Eski kayan nokta yuvarlama davranışını kullanmak için ile legacy_stdio_float_rounding.objbağlayın.

_snwprintf , öğesinin _snprintfgeniş karakterli bir sürümüdür; işaretçi _snwprintf bağımsız değişkenleri geniş karakterli dizelerdir. içindeki _snwprintf kodlama hatalarının algılanması, içindeki _snprintfalgılamadan farklı olabilir. _snwprintf, gibi swprintf, türünde bir hedef FILEyerine bir dizeye çıkış yazar.

Bu işlevlerin son ekine _l sahip sürümleri, geçerli iş parçacığı yerel ayarı yerine geçirilen yerel ayar parametresini kullanmaları dışında aynıdır.

C++ dilinde bu işlevler, daha yeni ve daha güvenli karşılıkları çağıran şablon aşırı yüklemelerine sahiptir. Daha fazla bilgi için bkz . Güvenli şablon aşırı yüklemeleri.

Genel metin yordamı eşlemeleri

Tchar.h olağan _UNICODE ve _MBCS tanımlanmadı _MBCS tanımlanan _UNICODE tanımlanan
_sntprintf _snprintf _snprintf _snwprintf
_sntprintf_l _snprintf_l _snprintf_l _snwprintf_l

Gereksinimler

Yordam Gerekli başlık
snprintf, _snprintf, _snprintf_l <stdio.h>
_snwprintf, _snwprintf_l <stdio.h> veya <wchar.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

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

Ayrıca bkz.

Akış G/Ç
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 işlevleri