Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı lendahil olmak üzere biçimlendirilmiş veri dizesinin uzunluğu olsunNULL.
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_snprintfve işlev ailesi, içinde biçimlendirip veya daha az karakter depolarcountbuffer. -
snprintfher zaman sonlandırıcı bir karakter depolarNULLve gerekirse çıkışı kesilir. - - 1 değerini
snprintf> döndürürsecount, çıkış kesilir. - İşlev
_snprintfailesi yalnızca biçimlendirilmiş dize uzunluğu karakterdenNULLdaha azsa sonlandırıcıcountbir karakter ekler. - Her
argument(varsa) dönüştürülür ve içindekiformatilgili biçim belirtimine göre çıkıştır. Biçim sıradan karakterlerden oluşur ve içinformatbağımsız değişkenle aynı biçime ve işleveprintfsahiptir. Çakışan dizeler arasında kopyalama olursa davranış tanımsızdır.
Davranış özeti
Aşağıdaki tablo için:
- boyutunun
sizeOfBufferolması gerekirbuffer. İşlev birchararabellek alırsa boyut bayt cinsindendir. İşlev birwchar_tarabellek alırsa, boyut 16 bit sözcük sayısını belirtir. -
lenBiçimlendirilmiş verilerin boyutu olsun. İşlev birchararabellek alırsa boyut bayt cinsindendir. İşlev birwchar_tarabellek alırsa, boyut 16 bit sözcük sayısını belirtir. - Karakterler, arabelleğe alınan
charişlevlerin karakterlerinecharve arabelleğe alınanwchar_tişlevlere yönelik karakterlere başvururwchar_t. - 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) |
Evet |
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) |
Evet |
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