Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Escreva a saída formatada usando um ponteiro para uma lista de argumentos. Versões mais seguras dessas funções estão disponíveis; confira vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l.
Sintaxe
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
Parâmetros
buffer
Local de armazenamento para saída.
count
Número máximo de caracteres a serem armazenados, nas versões de cadeia de caracteres larga desta função.
format
Especificação de formato.
argptr
Ponteiro para a lista de argumentos.
locale
A localidade a ser usada.
Valor de retorno
vsprintf e vswprintf retorna o número de caracteres gravados, sem incluir o caractere de terminação NULL , ou um valor negativo se ocorrer um erro de saída. Se buffer or format for um NULL ponteiro, essas funções invocarão o manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, essas funções retornarão -1 e definidas errno como EINVAL.
If buffer é um NULL ponteiro e count é zero vswprintf e _vswprintf_l retorna o número de caracteres que teriam sido gravados sem incluir o NULL de terminação.
Se buffer for válido e count for zero vswprintf e _vswprintf_l retorne -1. O conteúdo de buffer permanece inalterado.
Para obter informações sobre esses e outros códigos de erro, consulte errno, _doserrno, _sys_errliste _sys_nerr.
Observações
Cada uma dessas funções recebe um ponteiro para uma lista de argumentos e, em seguida, formata e grava os dados fornecidos na memória apontada por buffer.
As versões dessas funções com o _l sufixo são idênticas, exceto que elas usam o parâmetro locale passado em vez da localidade do thread atual.
Importante
Usando vsprintf, não há como limitar o número de caracteres gravados, o que significa que o código que usa essa função é suscetível a saturações de buffer. Em vez disso, use _vsnprintf ou chame _vscprintf para determinar o tamanho de um buffer necessário. Além disso, verifique se format não é uma cadeia de caracteres definida pelo usuário. Para obter mais informações, consulte Evitando saturações de buffer.
A partir do Windows 10 versão 2004 (build 19041), a printf família de funções imprime números de ponto flutuante exatamente representáveis de acordo com as regras IEEE 754 para arredondamento. Nas versões anteriores do Windows, os números de ponto flutuante exatamente representáveis que terminam em '5' sempre arredondavam para cima. O IEEE 754 afirma que eles devem arredondar para o dígito par mais próximo (também conhecido como "Arredondamento do Banqueiro"). Por exemplo, ambos printf("%1.0f", 1.5) e printf("%1.0f", 2.5) devem arredondar para 2. Anteriormente, 1,5 seria arredondado para 2 e 2,5 arredondado para 3. Essa alteração afeta apenas os números exatamente representáveis. Por exemplo, 2,35 (que, quando representado na memória, está mais próximo de 2,3500000000000000008) continua a arredondar para 2,4. O arredondamento feito por essas funções agora também respeita o modo de arredondamento de ponto flutuante definido por fesetround. Anteriormente, o arredondamento sempre escolhia FE_TONEAREST o comportamento. Essa alteração afeta apenas os programas criados usando o Visual Studio 2019 versão 16.2 e posterior. Para usar o comportamento de arredondamento de ponto flutuante herdado, vincule-o a legacy_stdio_float_rounding.obj.
vswprintf está em conformidade com o padrão ISO C, que requer o segundo parâmetro, count, do tipo size_t. Para forçar o comportamento não padrão antigo, defina _CRT_NON_CONFORMING_SWPRINTFS. O comportamento antigo pode não estar em uma versão futura, portanto, o código deve ser alterado para usar o novo comportamento em conformidade.
Em C++, essas funções têm sobrecargas de modelo que invocam as contrapartes mais recentes e seguras dessas funções. Para obter mais informações, consulte Sobrecargas de modelo seguras.
Mapeamentos de rotina de texto genérico
Rotina TCHAR.H |
_UNICODE e _MBCS não definidos |
_MBCS definido |
_UNICODE definido |
|---|---|---|---|
_vstprintf |
vsprintf |
vsprintf |
vswprintf |
_vstprintf_l |
_vsprintf_l |
_vsprintf_l |
_vswprintf_l |
Requisitos
| Rotina | Cabeçalho necessário | Cabeçalhos opcionais |
|---|---|---|
vsprintf, _vsprintf_l |
<stdio.h> e <stdarg.h> |
<varargs.h>* |
vswprintf, _vswprintf_l |
<stdio.h> ou <wchar.h>, e <stdarg.h> |
<varargs.h>* |
* Necessário para compatibilidade com UNIX V.
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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
Consulte também
E/S de fluxo
Funções vprintf
Sintaxe de especificação de formato: printf e wprintf funções
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_endva_start