sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

Biçimlendirilmiş verileri bir dizeye yazın. Bu işlevler, CRT'deki Güvenlik özellikleri bölümünde açıklandığı gibi güvenlik geliştirmeleri içeren , swprintf_sprintf_l, , , __swprintf_l_swprintf_l sürümleridir.sprintf

Sözdizimi

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   ...
);
int _sprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   _locale_t locale,
   ...
);
int swprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   ...
);
int _swprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   _locale_t locale,
   ...
);
template <size_t size>
int sprintf_s(
   char (&buffer)[size],
   const char *format,
   ...
); // C++ only
template <size_t size>
int swprintf_s(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   ...
); // C++ only

Parametreler

buffer
Çıktı için depolama konumu

sizeOfBuffer
Depolanacak maksimum karakter sayısı.

format
Biçim denetimi dizesi

...
Biçimlendirilecek isteğe bağlı bağımsız değişkenler

locale
Kullanılacak yerel ayar.

Daha fazla bilgi için bkz . Biçim belirtimi söz dizimi.

Dönüş değeri

Yazılan karakter sayısı veya hata oluştuysa -1. veya null bir işaretçiyse buffer ve sprintf_s swprintf_s -1 döndürerek olarak EINVALayarlayınerrno.format

sprintf_s , sonlandırıcı null karakteri saymamak için içinde bufferdepolanan bayt sayısını döndürür. swprintf_s , içinde depolanan buffergeniş karakterlerin sayısını döndürür, null geniş karakteri sonlandırmayı saymaz.

Açıklamalar

İşlev, sprintf_s içinde bir dizi karakteri ve değeri biçimlendirip depolar buffer. Her argument (varsa) dönüştürülür ve içindeki formatilgili biçim belirtimine göre çıkış yapılı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. Yazılan son karakterden sonra null karakter eklenir. Çakışan dizeler arasında kopyalama olursa davranış tanımsızdır.

ile sprintf sprintf_s arasındaki sprintf_s temel farklardan biri, biçim dizesini geçerli biçimlendirme karakterleri için denetlerkensprintf, yalnızca biçim dizesinin veya arabelleğin işaretçi olup NULL olmadığını denetler. Denetimlerden biri başarısız olursa, parametre doğrulamasında açıklandığı gibi geçersiz parametre işleyicisi çağrılır. Yürütmenin devam etmesi için izin verilirse, işlevi -1 döndürür ve olarak EINVALayarlanırerrno.

ile sprintf arasındaki sprintf_s diğer temel fark, çıkış arabelleğinin boyutunu karakter cinsinden belirten bir uzunluk parametresi almasıdırsprintf_s. Arabellek, sonlandırıcı null dahil olmak üzere biçimlendirilmiş metin için çok küçükse, içine null karakter buffer[0]yerleştirilerek arabellek boş bir dizeye ayarlanır ve geçersiz parametre işleyicisi çağrılır. 'nin aksine _snprintf, sprintf_s arabellek boyutu sıfır olmadığı sürece arabelleğin null olarak sonlandırılacağını garanti eder.

swprintf_s , öğesinin sprintf_sgeniş karakterli bir sürümüdür; işaretçi swprintf_s bağımsız değişkenleri geniş karakterli dizelerdir. içindeki swprintf_s kodlama hatalarının algılanması, içindeki sprintf_salgılamadan farklı olabilir. Bu işlevlerin sonekli _l sürümleri aynıdır, ancak geçerli iş parçacığı yerel ayarı yerine geçirilen yerel ayar parametresini kullanırlar.

C++ dilinde bu işlevlerin kullanımı şablon aşırı yüklemeleriyle basitleştirilir. Aşırı yüklemeler arabellek uzunluğunu otomatik olarak çıkararak boyut bağımsız değişkeni belirtme gereksinimini ortadan kaldırır. Ayrıca, eski, güvenli olmayan işlevleri otomatik olarak daha yeni ve daha güvenli karşılıklarla değiştirebilirler. Daha fazla bilgi için bkz . Güvenli şablon aşırı yüklemeleri.

Arabellek çok küçük olduğunda ne olacağı üzerinde daha fazla denetim sağlayan sürümleri sprintf_s vardır. Daha fazla bilgi için bkz. _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l.

Önemli

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 'legacy_stdio_float_rounding.obj' ile bağlantı sağlayın.

Genel metin yordamı eşlemeleri

TCHAR.H yordamı _UNICODE ve _MBCS tanımlanmadı _MBCS tanımlanan _UNICODE tanımlanan
_stprintf_s sprintf_s sprintf_s swprintf_s
_stprintf_s_l _sprintf_s_l _sprintf_s_l _swprintf_s_l

Gereksinimler

Yordam Gerekli başlık
sprintf_s, _sprintf_s_l C: <stdio.h>

C++: <cstdio> veya <stdio.h>
swprintf_s, _swprintf_s_l C: <stdio.h> veya <wchar.h>

C++: <cstdio>, <cwchar>, <stdio.h> veya <wchar.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek: Verileri biçimlendirmek için sprintf_s kullanma

// crt_sprintf_s.c
// This program uses sprintf_s 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_s( buffer, 200,     "   String:    %s\n", s );
   j += sprintf_s( buffer + j, 200 - j, "   Character: %c\n", c );
   j += sprintf_s( buffer + j, 200 - j, "   Integer:   %d\n", i );
   j += sprintf_s( buffer + j, 200 - j, "   Real:      %f\n", fp );

   printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
Output:
   String:    computer
   Character: l
   Integer:   35
   Real:      1.732053

character count = 79

Örnek: Hata kodu işleme

// crt_swprintf_s.c
// wide character example
// also demonstrates swprintf_s returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf_s( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf_s fails because string contains WEOF (\xffff)
   printf( "wrote %d characters\n", len );
}
wrote 11 characters
wrote -1 characters

Ayrıca bkz.

Akış G/Ç
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, , __swprintf_l
scanf, _scanf_l, wscanf, _wscanf_l
sscanf, _sscanf_l, swscanf, _swscanf_l
vprintf işlevleri