sprintf_s
, , _sprintf_s_l
swprintf_s
,_swprintf_s_l
Tulis data yang diformat ke string. Fungsi-fungsi ini adalah versi sprintf
, , _sprintf_l
swprintf
, _swprintf_l
, __swprintf_l
dengan peningkatan keamanan seperti yang dijelaskan dalam Fitur keamanan di CRT.
Sintaks
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
Parameter
buffer
Lokasi penyimpanan untuk output
sizeOfBuffer
Jumlah karakter maksimum yang akan disimpan.
format
String kontrol format
...
Argumen opsional yang akan diformat
locale
Lokal yang akan digunakan.
Untuk informasi selengkapnya, lihat Sintaks spesifikasi format.
Nilai hasil
Jumlah karakter yang ditulis, atau -1 jika terjadi kesalahan. Jika buffer
atau format
adalah penunjuk null, sprintf_s
dan swprintf_s
kembalikan -1 dan atur errno
ke EINVAL
.
sprintf_s
mengembalikan jumlah byte yang disimpan dalam buffer
, tidak menghitung karakter null yang dihentikan. swprintf_s
mengembalikan jumlah karakter lebar yang disimpan dalam buffer
, tidak menghitung karakter lebar null yang dihentikan.
Keterangan
Fungsi memformat sprintf_s
dan menyimpan serangkaian karakter dan nilai di buffer
. Masing-masing argument
(jika ada) dikonversi dan output sesuai dengan spesifikasi format yang sesuai di format
. Format terdiri dari karakter biasa dan memiliki bentuk dan fungsi yang sama dengan format
argumen untuk printf
. Karakter null ditambahkan setelah karakter terakhir ditulis. Jika penyalinan terjadi di antara string yang tumpang tindih, perilaku tidak terdefinisi.
Salah satu perbedaan utama antara sprintf_s
dan sprintf
adalah memeriksa string format untuk karakter pemformatan yang sprintf_s
valid, sedangkan sprintf
hanya memeriksa apakah string format atau buffer adalah NULL
penunjuk. Jika salah satu pemeriksaan gagal, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, fungsi mengembalikan -1 dan diatur errno
ke EINVAL
.
Perbedaan utama lainnya antara sprintf_s
dan sprintf
adalah yang mengambil parameter panjang yang sprintf_s
menentukan ukuran buffer output dalam karakter. Jika buffer terlalu kecil untuk teks yang diformat, termasuk penghentian null, maka buffer diatur ke string kosong dengan menempatkan karakter null di buffer[0]
, dan handler parameter yang tidak valid dipanggil. Tidak seperti _snprintf
, sprintf_s
menjamin bahwa buffer akan dihentikan null kecuali ukuran buffer adalah nol.
swprintf_s
adalah versi sprintf_s
karakter lebar ; argumen penunjuk untuk swprintf_s
adalah string karakter lebar. Deteksi kesalahan pengodean mungkin swprintf_s
berbeda dari deteksi di sprintf_s
. Versi fungsi-fungsi ini dengan _l
akhiran identik kecuali mereka menggunakan parameter lokal yang diteruskan alih-alih lokal utas saat ini.
Di C++, penggunaan fungsi-fungsi ini disederhanakan oleh kelebihan beban templat. Kelebihan beban dapat menyimpulkan panjang buffer secara otomatis, yang menghilangkan kebutuhan untuk menentukan argumen ukuran. Dan, mereka dapat secara otomatis mengganti fungsi yang lebih lama dan tidak aman dengan rekan-rekan yang lebih baru dan lebih aman. Untuk informasi selengkapnya, lihat Mengamankan kelebihan beban templat.
Ada versi yang menawarkan lebih banyak sprintf_s
kontrol atas apa yang terjadi jika buffer terlalu kecil. Untuk informasi selengkapnya, lihat _snprintf_s
, _snprintf_s_l
, _snwprintf_s
, _snwprintf_s_l
.
Penting
Mulai Windows 10 versi 2004 (build 19041), printf
keluarga fungsi mencetak angka titik mengambang yang persis dapat diwakili sesuai dengan aturan IEEE 754 untuk pembulatan. Di versi Windows sebelumnya, angka titik pecahan yang persis dapat diwakili yang berakhiran '5' akan selalu dibulatkan. IEEE 754 menyatakan bahwa mereka harus membulatkan ke digit terdekat bahkan (juga dikenal sebagai "Pembulatan Bankir"). Misalnya, dan printf("%1.0f", 1.5)
printf("%1.0f", 2.5)
harus membulatkan ke 2. Sebelumnya, 1,5 akan membulatkan ke 2 dan 2,5 akan dibulatkan ke 3. Perubahan ini hanya memengaruhi angka yang tepat yang dapat diwakili. Misalnya, 2,35 (yang, ketika diwakili dalam memori, lebih dekat ke 2,3500000000000000008) terus membulatkan ke atas hingga 2,4. Pembulatan yang dilakukan oleh fungsi-fungsi ini sekarang juga menghormati mode pembulatan titik mengambang yang ditetapkan oleh fesetround
. Sebelumnya, pembulatan selalu memilih FE_TONEAREST
perilaku. Perubahan ini hanya memengaruhi program yang dibuat menggunakan Visual Studio 2019 versi 16.2 dan yang lebih baru. Untuk menggunakan perilaku pembulatan titik mengambang warisan, tautkan dengan 'legacy_stdio_float_rounding.obj'.
Pemetaan rutin teks generik
TCHAR. Rutinitas H | _UNICODE dan _MBCS tidak ditentukan |
_MBCS Didefinisikan |
_UNICODE Didefinisikan |
---|---|---|---|
_stprintf_s |
sprintf_s |
sprintf_s |
swprintf_s |
_stprintf_s_l |
_sprintf_s_l |
_sprintf_s_l |
_swprintf_s_l |
Persyaratan
Rutin | Header yang diperlukan |
---|---|
sprintf_s , _sprintf_s_l |
C: <stdio.h> C++: <cstdio> atau <stdio.h> |
swprintf_s , _swprintf_s_l |
C: <stdio.h> atau <wchar.h> C++: <cstdio>, <cwchar>, <stdio.h> atau <wchar.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh: Gunakan sprintf_s untuk memformat data
// 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
Contoh: Penanganan kode kesalahan
// 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
Lihat juga
Streaming I/O
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
Fungsi