sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

Escribir datos con formato en una cadena. Estas versiones de sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l tienen mejoras de seguridad, como se describe en Características de seguridad de CRT.

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
   argument] ... 
);
int _sprintf_s_l(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format,
   locale_t locale [,
   argument] ... 
);
int swprintf_s(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format [,
   argument]...
);
int _swprintf_s_l(
   wchar_t *buffer,
   size_t sizeOfBuffer,
   const wchar_t *format,
   locale_t locale [,
   argument]…
);
template <size_t size>
int sprintf_s(
   char (&buffer)[size],
   const char *format [,
   argument] ... 
); // C++ only
template <size_t size>
int swprintf_s(
   wchar_t (&buffer)[size],
   const wchar_t *format [,
   argument]...
); // C++ only

Parámetros

  • buffer
    Ubicación de almacenamiento para los resultados

  • sizeOfBuffer
    Número máximo de caracteres que se pueden almacenar.

  • format
    Cadena de control de formato

  • argument
    Argumentos opcionales

  • locale
    Configuración regional que se va a usar.

Para obtener más información, vea Especificaciones de formato.

Valor devuelto

El número de caracteres escrito, o – 1 si se ha producido un error. Si buffer o format es un puntero null, sprintf_s y swprintf_s y devuelven -1 y establecen errno como EINVAL.

sprintf_s devuelve el número de bytes almacenados en buffer, sin contar el carácter null de terminación. swprintf_s devuelve el número de caracteres anchos almacenados en buffer, sin contar el carácter ancho final null.

Comentarios

La función sprintf_s da formato y almacena una serie de caracteres y valores en buffer. Cada argument (si existe) se convierte y sale según la especificación de formato correspondiente de format. El formato consta de caracteres ordinarios y tiene el mismo formato y función que el argumento format para printf. Un carácter null se anexa después del último carácter escrito. Si la copia tiene lugar entre cadenas que se superponen, el comportamiento es indefinido.

Una gran diferencia entre sprintf_s y sprintf es que sprintf_s comprueba la cadena de formato de los caracteres de formato válidos, mientras que sprintf solo comprueba si la cadena de formato o el búfer son punteros de NULL. Si hay errores en alguna comprobación, se invoca al controlador de parámetros no válidos, tal y como se describe en Validación de parámetros. Si la ejecución puede continuar, la función devuelve -1 y establece errno en EINVAL.

Otra diferencia principal entre sprintf_s y sprintf es que sprintf_s toma un parámetro de longitud que especifica el tamaño del búfer de salida en caracteres. Si el búfer es demasiado pequeño para el texto que se va a imprimir, el búfer se establece en una cadena vacía y el controlador de parámetros no válidos se invoca. A diferencia de snprintf, sprintf_s garantiza que el búfer termina en null (a menos que el tamaño de búfer sea cero).

swprintf_s es una versión con caracteres anchos de sprintf_s; los argumentos de puntero a swprintf_s son cadenas de carácter ancho. La detección de errores de codificación en swprintf_s puede diferir de la de sprintf_s. Las versiones de estas funciones con el sufijo _l son idénticas salvo que usan el parámetro locale pasado en lugar de la configuración regional del subproceso actual.

En C++, el uso de estas funciones se simplifica con las sobrecargas de plantilla; las sobrecargas pueden realizar una inferencia automáticamente de la longitud de búfer (lo que elimina la necesidad de especificar un argumento de tamaño) y pueden reemplazar automáticamente funciones anteriores no seguras con sus homólogos seguros más recientes. Para obtener más información, vea Sobrecargas de plantilla seguras.

Hay versiones de sprintf_s que proporcionan un control adicional sobre lo que sucede si el búfer es demasiado pequeño. Para obtener más información, vea _snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l.

Asignaciones de rutina de texto genérico

Rutina TCHAR.H

_UNICODE y _MBCS no 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

Requisitos

Rutina

Encabezado necesario

sprintf_s, _sprintf_s_l

<stdio.h>

swprintf_s, _swprintf_s_l

<stdio.h> o <wchar.h>

Para obtener información adicional de compatibilidad, vea Compatibilidad en la Introducción.

Ejemplo

// 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 );
}
  
// 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 );
}
  

Equivalente en .NET Framework

System::String::Format

Vea también

Referencia

E/S de secuencia

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

vprintf (Funciones)