Aracılığıyla paylaş


vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l

Bir bağımsız değişken listesinin işaretçisini kullanarak biçimlendirilmiş çıktı yazın. Bu işlevlerin daha güvenli sürümleri mevcuttur; bkz. vsprintf_s, _vsprintf_s_l, vswprintf_s. _vswprintf_s_l

Sözdizimi

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

Parametreler

buffer
Çıkış için Depolama konum.

count
Bu işlevin geniş dize sürümlerinde saklanacak karakter sayısı üst sınırı.

format
Biçim belirtimi.

argptr
Bağımsız değişken listesinin işaretçisi.

locale
Kullanılacak yerel ayar.

Dönüş değeri

vsprintf ve vswprintf sonlandırıcı NULL karakter dahil değil, yazılan karakter sayısını veya bir çıkış hatası oluşursa negatif bir değer döndürür. veya format bir işaretçiysebuffer, bu işlevler Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre NULL işleyicisini çağırır. Yürütmenin devam etmesi için izin verilirse, bu işlevler -1 döndürür ve olarak EINVALayarlanırerrno.

Bunlar ve diğer hata kodları hakkında bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.

Açıklamalar

Bu işlevlerin her biri bir bağımsız değişken listesinin işaretçisini alır ve verilen verileri tarafından bufferişaret edilen belleğe biçimlendirip yazar.

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.

Önemli

kullanarak vsprintf, yazılan karakter sayısını sınırlamanın bir yolu yoktur; bu da bu işlevi kullanan kodun arabellek taşmalarına duyarlı olduğu anlamına gelir. Bunun yerine kullanın _vsnprintf veya arabelleğin ne kadar büyük olması gerektiğini belirlemek için çağrısı _vscprintf yapın. Ayrıca, kullanıcı tanımlı bir dize olmadığından emin olun format . 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 'legacy_stdio_float_rounding.obj' ile bağlantı sağlayın.

vswprintf, türünde size_tikinci parametreyi countgerektiren ISO C Standard'a uygundur. Eski standart olmayan davranışı zorlamak için tanımlayın _CRT_NON_CONFORMING_SWPRINTFS. Eski davranış gelecekteki bir sürümde olmayabilir, bu nedenle kod yeni uyumlu davranışı kullanacak şekilde değiştirilmelidir.

C++ dilinde, bu işlevlerin daha yeni ve güvenli karşılıklarını çağıran şablon aşırı yüklemeleri vardır. Daha fazla bilgi için bkz . Güvenli şablon aşırı yüklemeleri.

Genel metin yordamı eşlemeleri

TCHAR.H Rutin _UNICODE ve _MBCS tanımlanmadı _MBCS Tanımlanan _UNICODE Tanımlanan
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

Gereksinimler

Yordam Gerekli başlık İsteğe bağlı üst bilgiler
vsprintf, _vsprintf_l <stdio.h> ve <stdarg.h> <varargs.h>*
vswprintf, _vswprintf_l <stdio.h> veya <wchar.h>ve <stdarg.h> <varargs.h>*

* UNIX V uyumluluğu için gereklidir.

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Örnek

// 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

Ayrıca bkz.

Akış G/Ç
vprintf işlevleri
Biçim belirtimi söz dizimi: printf ve wprintf işlevleri
fprintf, _fprintf_l, fwprintf, _fwprintf_l
printf, _printf_l, wprintf, _wprintf_l
sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
va_arg, va_copy, va_end, va_start