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 EINVAL
ayarlayınerrno
.format
sprintf_s
, sonlandırıcı null karakteri saymamak için içinde buffer
depolanan bayt sayısını döndürür. swprintf_s
, içinde depolanan buffer
geniş 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 format
ilgili biçim belirtimine göre çıkış yapılır. Biçim sıradan karakterlerden oluşur ve için printf
bağı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 EINVAL
ayarlanı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_s
geniş 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_s
algı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 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 '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