Partilhar via


sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

Gravar dados formatados em uma cadeia de caracteres. Essas funções são versões de , sprintf, _sprintf_l, swprintf, com aprimoramentos de segurança, _swprintf_lconforme descrito em Recursos de__swprintf_lsegurança no CRT.

Sintaxe

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

Parâmetros

buffer
Local de armazenamento para saída

sizeOfBuffer
Número máximo de caracteres a armazenar.

format
Cadeia de caracteres de controle de formato

...
Argumentos opcionais a serem formatados

locale
A localidade a ser usada.

Para obter mais informações, consulte Sintaxe da especificação de formato.

Valor de retorno

O número de caracteres gravados ou -1 se ocorreu um erro. Se buffer ou format for um ponteiro nulo, sprintf_s retorne swprintf_s -1 e defina errno como EINVAL.

sprintf_s Retorna o número de bytes armazenados no buffer, sem contar o caractere nulo de encerramento. swprintf_s Retorna o número de caracteres largos armazenados no buffer, sem contar o caractere de largura nulo de terminação.

Observações

A sprintf_s função formata e armazena uma série de caracteres e valores no buffer. Cada argument um (se houver) é convertido e saída de acordo com a especificação de formato correspondente em format. O formato consiste em caracteres comuns e tem a mesma forma e função que o argumento format para printf. Um caractere nulo é acrescentado após o último caractere escrito. Se a cópia ocorrer entre cadeias de caracteres que se sobrepõem, o comportamento será indefinido.

Uma diferença principal entre sprintf_s e sprintf é que sprintf_s verifica a cadeia de caracteres de formato para caracteres de formatação válidos, enquanto sprintf verifica apenas se a cadeia de caracteres de formato ou buffer são NULL ponteiros. Se qualquer verificação falhar, o manipulador de parâmetros inválido será invocado, conforme descrito em Validação de parâmetros. Se a execução for permitida para continuar, a função retorna -1 e define errno como EINVAL.

A outra diferença principal entre sprintf_s e sprintf é que sprintf_s usa um parâmetro length especificando o tamanho do buffer de saída em caracteres. Se o buffer for muito pequeno para o texto formatado, incluindo o nulo de terminação, o buffer será definido como uma cadeia de caracteres vazia colocando um caractere nulo em buffer[0], e o manipulador de parâmetros inválido será invocado. Ao contrário _snprintfdo , sprintf_s garante que o buffer será terminado nulo, a menos que o tamanho do buffer seja zero.

swprintf_sé uma versão de caracteres largos de ; os argumentos de ponteiro para sprintf_s são cadeias de swprintf_scaracteres largos. A deteção de erros de codificação em swprintf_s pode diferir da deteção em sprintf_s. As versões dessas funções com o sufixo _l são idênticas, exceto que elas usam o parâmetro locale passado em vez da localidade thread atual.

Em C++, o uso dessas funções é simplificado por sobrecargas de modelo. As sobrecargas podem inferir o comprimento do buffer automaticamente, o que elimina a necessidade de especificar um argumento de tamanho. E podem substituir automaticamente funções mais antigas e não seguras por funções mais novas e mais seguras. Para obter mais informações, consulte Sobrecargas de modelo seguro.

Existem versões que sprintf_s oferecem mais controle sobre o que acontece se o buffer for muito pequeno. Para obter mais informações, consulte _snprintf_s, _snprintf_s_l, , _snwprintf_s_snwprintf_s_l.

Importante

A partir do Windows 10 versão 2004 (build 19041), a família de funções imprime printf números de ponto flutuante exatamente representáveis de acordo com as regras IEEE 754 para arredondamento. Em versões anteriores do Windows, números de ponto flutuante exatamente representáveis terminando em '5' sempre arredondavam para cima. 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) deve arredondar para 2. Anteriormente, 1,5 arredondava para 2 e 2,5 arredondava para 3. Esta alteração afeta apenas números exatamente representáveis. Por exemplo, 2.35 (que, quando representado na memória, está mais próximo de 2.35000000000000008) 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 pela fesetround. Anteriormente, o arredondamento sempre escolhia o FE_TONEAREST 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-se a legacy_stdio_float_rounding.obj.

Mapeamentos de rotina de texto genérico

TCHAR. Rotina H _UNICODE e _MBCS não definidos _MBCS definido _UNICODE definido
_stprintf_s sprintf_s sprintf_s swprintf_s
_stprintf_s_l _sprintf_s_l _sprintf_s_l _swprintf_s_l

Requerimentos

Rotina Cabeçalho obrigatório
sprintf_s, _sprintf_s_l C: <stdio.h>

C++: <cstdio> ou <stdio.h>
swprintf_s, _swprintf_s_l C: <stdio.h> ou <wchar.h>

C++: <cstdio>, <cwchar>, <stdio.h> ou <wchar.h>

Para obter mais informações sobre compatibilidade, consulte Compatibilidade.

Exemplo: usar sprintf_s para formatar dados

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

Exemplo: Tratamento de código de erro

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

Ver também

de E/S de fluxo
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 funções