Aracılığıyla paylaş


_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l

Bir dize veri yazma biçimlendirilmiş.Bunlar sürümleridir _snprintf, _snprintf_l, _snwprintf, _snwprintf_l açıklandığı gibi güvenlik geliştirmeleri ile crt güvenlik özellikleri.

int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format [,
   argument] ... 
);
int _snprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   locale_t locale [,
   argument] ... 
);
int _snwprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format [,
   argument] ... 
);
int _snwprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const wchar_t *format,
   locale_t locale [,
   argument] ... 
);
template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
   argument] ... 
); // C++ only
template <size_t size>
int _snwprintf_s(
   wchar_t (&buffer)[size],
   size_t count,
   const wchar_t *format [,
   argument] ... 
); // C++ only

Parametreler

  • buffer
    Çıkış için depolama konumu.

  • sizeOfBuffer
    Çıkış için depolama konumu boyutu.Size in bytes for _snprintf_s or size in words for _snwprintf_s.

  • Count
    En fazla karakter sayısı olarak depolamak için veya _TRUNCATE.

  • format
    Denetim biçim dizesi.

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

  • locale
    Kullanılacak yerel ayarı.

Dönüş Değeri

_snprintf_sdepolanan karakter sayısını verir buffer, sondaki boş karakter hesaplanmaz._snwprintf_sdepolanan geniş karakter sayısını verir buffer, null Sonlandırıcı geniş karakter hesaplanmaz.

Sonlandırıcı boş veri saklamak için gerekli depolama aşarsa sizeOfBuffer, geçersiz parametre işleyicisi, açıklandığı şekilde çağrılır Parametre doğrulama.Geçersiz parametre işleyicisi sonra yürütme devam ederse, bu işlevler kümesi buffer boş bir dize olarak errno için ERANGEve -1 döndürür.

buffer Veya format olan bir NULL işaretçisi, veya count küçük veya eşit ise sıfır olarak geçersiz parametre işleyicisi çağrılır.Yürütülmesine devam etmek için izin verilmişse, bu işlevler kümesi errno için EINVAL ve -1 döndürür.

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

Notlar

_snprintf_s İşlevi biçimleri ve mağazalar count veya daha az karakter buffer ve Sonlandırıcı boş değer ekler.Her bağımsız değişken (varsa) dönüştürülür ve ilgili biçim belirtimini uyarınca çıktı format.Tutarlı biçimlendirme printf aile işlevleri; see Biçim Belirtim Sözdizimi: printf ve wprintf İşlevleri.Kopyalama dizeler arasında çakışma oluşursa, tanımsız bir davranıştır.

count Olan _TRUNCATE, sonra _snprintf_s yazma dize olarak kadarını Sığdır buffer Sonlandırıcı boş bir oda bırakarak oluştu.Tüm dize (Sonlandırıcı null ile) tam buffer, sonra _snprintf_s (Sonlandırıcı boş hariç) yazılmış; karakter sayısını verir Aksi halde, _snprintf_s oluştu, kesme belirtmek için -1 döndürür.

Güvenlik NotuGüvenlik Notu

Emin format kullanıcı tanımlı bir dize değil.

_snwprintf_sgeniş karakter sürümü _snprintf_s; İşaretçi bağımsız _snwprintf_s geniş karakter dizeleridir.Kodlama hatalarını algılama _snwprintf_s görünenden farklı _snprintf_s._snwprintf_s, gibi swprintf_s, hedef türü yerine bir dize çıktı Yazar FILE.

Bu işlevler ile sürümlerini _l soneki yerine geçerli iş parçacığı yerel geçirilen yerel parametresi kullandıkları dışında aynı.

C++'da, bu işlevler tarafından şablon aşırı kolaylaştırılmıştır; aşırı arabellek uzunluğu otomatik olarak gerçekleştirip (size baðýmsýz deðiþkeni belirtmek gereğini ortadan kaldırır) ve bunlar otomatik olarak yeni, güvenli karşılıkları ile eski, güvenli olmayan işlevler değiştirebilirsiniz.Daha fazla bilgi için bkz. Güvenli şablon aşırı yükleme.

Genel metin yordamı eşlemeleri

Tchar.h yordamına girildi

_UNICODE ve _mbcs tanımlı değil

Tanımlanan _mbcs

Tanımlanan _UNICODE

_sntprintf_s

_snprintf_s

_snprintf_s

_snwprintf_s

_sntprintf_s_l

_snprintf_s_l

_snprintf_s_l

_snwprintf_s_l

Gereksinimler

Yordamı

Gerekli başlık

_snprintf_s, _snprintf_s_l

<stdio.h>

_snwprintf_s, _snwprintf_s_l

<stdio.h> veya <wchar.h>

Daha fazla uyumluluk bilgileri için bkz: Uyumluluk giriş.

Örnek

// crt_snprintf_s.cpp
// compile with: /MTd

// These #defines enable secure template overloads
// (see last part of Examples() below)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <crtdbg.h>  // For _CrtSetReportMode
#include <errno.h>

// This example uses a 10-byte destination buffer.

int snprintf_s_tester( const char * fmt, int x, int count )
{
   char dest[10];

   printf( "\n" );

   if ( count == _TRUNCATE )
      printf( "%d-byte buffer; truncation semantics\n",
               _countof(dest) );
   else
      printf( "count = %d; %d-byte buffer\n",
               count, _countof(dest) );

   int ret = _snprintf_s( dest, _countof(dest), count, fmt, x );

   printf( "    new contents of dest: '%s'\n", dest );

   return ret;
}


void Examples()
{
   // formatted output string is 9 characters long: "<<<123>>>"
   snprintf_s_tester( "<<<%d>>>", 121, 8 );
   snprintf_s_tester( "<<<%d>>>", 121, 9 );
   snprintf_s_tester( "<<<%d>>>", 121, 10 );

   printf( "\nDestination buffer too small:\n" );

   snprintf_s_tester( "<<<%d>>>", 1221, 10 );

   printf( "\nTruncation examples:\n" );

   int ret = snprintf_s_tester( "<<<%d>>>", 1221, _TRUNCATE );
   printf( "    truncation %s occur\n", ret == -1 ? "did"
                                                  : "did not" );

   ret = snprintf_s_tester( "<<<%d>>>", 121, _TRUNCATE );
   printf( "    truncation %s occur\n", ret == -1 ? "did"
                                                  : "did not" );
   printf( "\nSecure template overload example:\n" );

   char dest[10];
   _snprintf( dest, 10, "<<<%d>>>", 12321 );
   // With secure template overloads enabled (see #defines
   // at top of file), the preceding line is replaced by
   //    _snprintf_s( dest, _countof(dest), 10, "<<<%d>>>", 12345 );
   // Instead of causing a buffer overrun, _snprintf_s invokes
   // the invalid parameter handler.
   // If secure template overloads were disabled, _snprintf would
   // write 10 characters and overrun the dest buffer.
   printf( "    new contents of dest: '%s'\n", dest );
}

void myInvalidParameterHandler(
   const wchar_t* expression,
   const wchar_t* function, 
   const wchar_t* file, 
   unsigned int line, 
   uintptr_t pReserved)
{
   wprintf(L"Invalid parameter handler invoked: %s\n", expression);
}

int main( void )
{
   _invalid_parameter_handler oldHandler, newHandler;

   newHandler = myInvalidParameterHandler;
   oldHandler = _set_invalid_parameter_handler(newHandler);
   // Disable the message box for assertions.
   _CrtSetReportMode(_CRT_ASSERT, 0);

   Examples();
}
  

.NET Framework Eşdeğeri

Yoktur. Standart c işlevi çağırmak için kullanmak PInvoke. Daha fazla bilgi için bkz: Platform Çağırma örnekleri.

Ayrıca bkz.

Başvuru

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