sprintf, _sprintf_l, swprintf, , _swprintf, _swprintf_l, __swprintf_l

Biçimlendirilmiş verileri bir dizeye yazın. Bu işlevlerden bazılarının daha güvenli sürümleri mevcuttur; bkz. sprintf_s, _sprintf_s_l, swprintf_s. _swprintf_s_l ve _swprintf_l öğesinin swprintf güvenli sürümleri, arabellek boyutunu parametre olarak alır.

Sözdizimi

int sprintf(
   char *buffer,
   const char *format [,
   argument] ...
);

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

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

int _swprintf(
   wchar_t *buffer,
   const wchar_t *format [,
   argument]...
);

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

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

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

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

Parametreler

buffer
Çıktı için depolama konumu

count
Bu işlevin Unicode sürümünde saklanacak karakter sayısı üst sınırı.

format
Biçim denetimi dizesi

argument
İsteğ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 format null bir işaretçiysebuffer, 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, bu işlevler -1 döndürür ve olarak EINVALayarlanırerrno.

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

Açıklamalar

İşlev, sprintf 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.

Önemli

kullanarak sprintf, yazılan karakter sayısını sınırlamanın bir yolu yoktur; bu, kullanan sprintf kodun arabellek taşmalarına duyarlı olduğu anlamına gelir. öğesine yazacak bufferen fazla karakter sayısını belirten ilgili işlevini snprintfkullanmayı veya arabelleğin ne kadar büyük olduğunu belirlemek için kullanmayı _scprintf göz önünde bulundurun. Ayrıca, kullanıcı tanımlı bir dize olmadığından emin olun format .

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.

swprintf , öğesinin sprintfgeniş karakterli bir sürümüdür; işaretçi swprintf bağımsız değişkenleri geniş karakterli dizelerdir. içindeki swprintf kodlama hatalarının algılanması ile sprintfarasında farklılık gösterebilir. swprintfve fwprintf türündeki bir hedef FILEyerine bir dizeye çıkış yazma dışında swprintf aynı şekilde davranır ve swprintf yazılacak en fazla karakter sayısını belirtmek için parametresini gerektirircount. 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.

için imza swprintf standartlaştırılmadan önce, karakter sayısı parametresini almayan eski bir Microsoft C çalışma zamanı kitaplığında gönderilen bir sürüm. Eski sürüm Microsoft C çalışma zamanı kitaplığında hala kullanılabilir, ancak kullanım dışıdır ve yeniden adlandırılmıştır _swprintf(). Eski imzaya göre yazılmış olan kod için, çağrısının ile swprintf _swprintfeşlendiği öğesini tanımlayın_CRT_NON_CONFORMING_SWPRINTFS. Gelecekteki bir sürümde eski davranış kaldırılabilir, bu nedenle kod yeni uyumlu davranışı kullanacak şekilde değiştirilmelidir.

C++ dilinde, bu işlevlerin daha yeni ve güvenli karşılıklarını çağıran şablon aşırı yüklemeleri vardır. 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
_stprintf sprintf sprintf _swprintf
_stprintf_l _sprintf_l _sprintf_l __swprintf_l

Gereksinimler

Yordam Gerekli başlık
sprintf, _sprintf_l <stdio.h>
swprintf, _swprintf, _swprintf_l <stdio.h> veya <wchar.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek: Verileri biçimlendirmek için kullanın sprintf

// crt_sprintf.c
// compile with: /W3
// This program uses sprintf 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( buffer,     "   String:    %s\n", s ); // C4996
   j += sprintf( buffer + j, "   Character: %c\n", c ); // C4996
   j += sprintf( buffer + j, "   Integer:   %d\n", i ); // C4996
   j += sprintf( buffer + j, "   Real:      %f\n", fp );// C4996
   // Note: sprintf is deprecated; consider using sprintf_s instead

   printf( "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.c
// wide character example
// also demonstrates swprintf returning error code
#include <stdio.h>

int main( void )
{
   wchar_t buf[100];
   int len = swprintf( buf, 100, L"%s", L"Hello world" );
   printf( "wrote %d characters\n", len );
   len = swprintf( buf, 100, L"%s", L"Hello\xffff world" );
   // swprintf 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
scanf, _scanf_l, wscanf, _wscanf_l
sscanf, _sscanf_l, swscanf, _swscanf_l
vprintf işlevleri