Bagikan melalui


vsprintf, , _vsprintf_lvswprintf, , _vswprintf_l,__vswprintf_l

Tulis output berformat menggunakan penunjuk ke daftar argumen. Versi yang lebih aman dari fungsi-fungsi ini tersedia; lihat vsprintf_s, _vsprintf_s_l, vswprintf_s, . _vswprintf_s_l

Sintaksis

int vsprintf(
   char *buffer,
   const char *format,
   va_list argptr
);
int _vsprintf_l(
   char *buffer,
   const char *format,
   _locale_t locale,
   va_list argptr
);
int vswprintf(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   va_list argptr
);
int _vswprintf_l(
   wchar_t *buffer,
   size_t count,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
int __vswprintf_l(
   wchar_t *buffer,
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
);
template <size_t size>
int vsprintf(
   char (&buffer)[size],
   const char *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vsprintf_l(
   char (&buffer)[size],
   const char *format,
   _locale_t locale,
   va_list argptr
); // C++ only
template <size_t size>
int vswprintf(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   va_list argptr
); // C++ only
template <size_t size>
int _vswprintf_l(
   wchar_t (&buffer)[size],
   const wchar_t *format,
   _locale_t locale,
   va_list argptr
); // C++ only

Parameter-parameternya

buffer
Lokasi penyimpanan untuk output.

count
Jumlah maksimum karakter yang akan disimpan, dalam versi string lebar dari fungsi ini.

format
Spesifikasi format.

argptr
Penunjuk ke daftar argumen.

locale
Lokal yang akan digunakan.

Mengembalikan nilai

vsprintf dan vswprintf mengembalikan jumlah karakter yang ditulis, tidak termasuk karakter pengakhiran NULL , atau nilai negatif jika terjadi kesalahan output. Jika buffer atau format merupakan NULL penunjuk, fungsi ini memanggil penanganan parameter yang tidak valid, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk dilanjutkan, fungsi ini mengembalikan -1 dan diatur errno ke EINVAL.

If buffer adalah NULL penunjuk dan count nol, vswprintf dan _vswprintf_l mengembalikan jumlah karakter yang akan ditulis tidak termasuk NULL yang mengakhiri.

Jika buffer valid dan count nol, vswprintf dan _vswprintf_l kembalikan -1. Isinya buffer tidak berubah.

Untuk informasi tentang kode kesalahan ini dan kode kesalahan lainnya, lihat errno, _doserrno, _sys_errlist, dan _sys_nerr.

Komentar

Masing-masing fungsi ini mengambil penunjuk ke daftar argumen, lalu memformat dan menulis data yang diberikan ke memori yang ditunjuk oleh buffer.

Versi fungsi ini dengan _l akhiran identik kecuali bahwa mereka menggunakan parameter lokal yang diteruskan alih-alih lokal utas saat ini.

Penting

Menggunakan vsprintf, tidak ada cara untuk membatasi jumlah karakter yang ditulis, yang berarti bahwa kode yang menggunakan fungsi ini rentan terhadap pembengkakan buffer. Gunakan _vsnprintf sebagai gantinya, atau panggil _vscprintf untuk menentukan seberapa besar buffer yang dibutuhkan. Juga, pastikan itu format bukan string yang ditentukan pengguna. Untuk informasi selengkapnya, lihat Menghindari overruns buffer. 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.

vswprintf sesuai dengan Standar ISO C, yang membutuhkan parameter kedua, count, dari jenis size_t. Untuk memaksakan perilaku nonstandar lama, definisikan _CRT_NON_CONFORMING_SWPRINTFS. Perilaku lama mungkin tidak ada di versi mendatang, jadi kode harus diubah untuk menggunakan perilaku baru yang sesuai.

Di C++, fungsi-fungsi ini memiliki kelebihan templat yang memanggil rekan yang lebih baru dan aman dari fungsi-fungsi ini. Untuk informasi selengkapnya, lihat Mengamankan kelebihan beban templat.

Pemetaan rutin teks generik

TCHAR.H Rutin _UNICODE dan _MBCS tidak ditentukan _MBCS Didefinisikan _UNICODE Didefinisikan
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

Persyaratan

Rutin Header yang diperlukan Header opsional
vsprintf, _vsprintf_l <stdio.h> dan <stdarg.h> <varargs.h>*
vswprintf, _vswprintf_l <stdio.h> atau <wchar.h>, dan <stdarg.h> <varargs.h>*

* Diperlukan untuk kompatibilitas UNIX V.

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

// crt_vsprintf.c
// compile with: cl /W4 crt_vsprintf.c
// This program uses vsprintf to write to a buffer.
// The size of the buffer is determined by _vscprintf.

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

void test( char const * const format, ... )
{
    va_list args;
    int     len;
    char    *buffer;

    // retrieve the variable arguments
    va_start( args, format );

    len = _vscprintf( format, args ) // _vscprintf doesn't count
                                + 1; // terminating '\0'

    buffer = (char*)malloc( len * sizeof(char) );
    if ( 0 != buffer )
    {
        vsprintf( buffer, format, args ); // C4996
        // Note: vsprintf is deprecated; consider using vsprintf_s instead
        puts( buffer );

        free( buffer );
    }
    va_end( args );
}

int main( void )
{
   test( "%d %c %d", 123, '<', 456 );
   test( "%s", "This is a string" );
}
123 < 456
This is a string

Lihat juga

Streaming I/O
vprintf berfungsi sebagai
Sintaks spesifikasi format: printf dan wprintf fungsi
fprintf, , _fprintf_lfwprintf,_fwprintf_l
printf, , _printf_lwprintf,_wprintf_l
sprintf, _sprintf_l, , swprintf, _swprintf_l__swprintf_l
va_arg, , va_copyva_end,va_start