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_t
iş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ı NULL
dahil olmak üzere biçimlendirilmiş veri dizesinin uzunluğu olsunlen
.
Tüm işlevler için, ise len < count
len
karakterler içinde buffer
depolanır, bir null sonlandırıcı eklenir ve sonlandırıcı NULL
dahil olmak üzere yazılmayan karakter sayısı döndürülür.
Bu işlevlerin geniş karakter sürümleri, sonlandırıcı NULL
dahil 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 _snprintf
aynı 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 depolarbuffer
count
.snprintf
her zaman sonlandırıcı bir karakter depolarNULL
ve gerekirse çıkışı kesilir.- - 1 değerini >
count
döndürürsesnprintf
, çıkış kesilir. - İşlev
_snprintf
ailesi yalnızca biçimlendirilmiş dize uzunluğu karakterdencount
daha azsa sonlandırıcıNULL
bir karakter ekler. - Her
argument
(varsa) dönüştürülür ve içindekiformat
ilgili biçim belirtimine göre çıkıştır. Biçim sıradan karakterlerden oluşur ve içinprintf
bağımsız değişkenle aynı biçime ve işleveformat
sahiptir. Çakışan dizeler arasında kopyalama olursa davranış tanımsızdır.
Davranış özeti
Aşağıdaki tablo için:
- boyutunun
buffer
olması gerekirsizeOfBuffer
. İşlev birchar
arabellek alırsa boyut bayt cinsindendir. İşlev birwchar_t
arabellek alırsa, boyut 16 bit sözcük sayısını belirtir. len
Biçimlendirilmiş verilerin boyutu olsun. İşlev birchar
arabellek alırsa boyut bayt cinsindendir. İşlev birwchar_t
arabellek alırsa, boyut 16 bit sözcük sayısını belirtir.- Karakterler, arabelleğe alınan
char
işlevlerin karakterlerinewchar_t
ve arabelleğe alınanwchar_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 , , S veya 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 C iş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ı NULL dahil 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ı NULL dahil olmak üzere yazılabilecek karakter sayısı. Dize ve sonlandırıcı NULL iç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ı NULL dahil 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ı NULL ile yazılır. |
Sonlandırıcı NULL dahil 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ı NULL dahil 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_errlist
ve _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 count
olduğ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 fesetround
ayarlanan 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.obj
bağlayın.
_snwprintf
, öğesinin _snprintf
geniş 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 _snprintf
algılamadan farklı olabilir. _snwprintf
, gibi swprintf
, türünde bir hedef FILE
yerine 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