Pregunta

Tengo un programa C que usa sprintf_s. Funciona bien en Windows, pero cuando compilo mi código en Linux, le da este error:

sprintf_s was not declared in this scope.

¿Por qué sucede esto y cómo puedo solucionarlo?

¿Fue útil?

Solución

No es estándar, no encontrará tal función en Linux.

Función estándar snprintf debería tener una semántica similar.

Otros consejos

SPRINTF_S no es parte de la biblioteca C estándar, por lo que no es portátil, por lo que no puede usarla en Linux. Pero tienes snprintf, lo cual es muy similar y debería ayudarte a lograr lo que quieres.

sprintf_s no es parte de la biblioteca C estándar, y no podrá usarla en Linux.

Sin embargo, snprintf es estándar y debe hacer la misma tarea.

sprintf_s es solo una parte del anexo K, un anexo opcional al estándar C11:

Anexo k

...

K.2 Alcance

  1. Este anexo especifica una serie de opcional Extensiones que pueden ser útiles en la mitigación de las vulnerabilidades de seguridad en los programas y comprenden nuevas funciones, macros y tipos declarados o definidos en los encabezados estándar existentes.

...

K.3.5.3.6 La función SPRINTF_S

Sinopsis

#define __STDC_WANT_LIB_EXT1__1
#include <stdio.h>
int sprintf_s(char * restrict s, rsize_t n,
const char * restrict format, ...);

(énfasis añadido)

Nunca se convirtió en Posix (o Linux) (y no se pierde en absoluto, incluso hay argumentos sobre su utilidad en el comité).

Para una mejor portabilidad, use snprintf que forma parte del estándar central y proporciona toda la funcionalidad que necesitará.

SnPrintf es inseguro, solo SPRINTF_S es seguro. SnPrintf no garantiza agregar un final 0, lo que lleva a posibles desbordamientos posteriores. mirar https://github.com/rurban/safeclib para una implementación adecuada.

Durante un porte de mi programa de Windows a Linux, escribí la siguiente implementación en mi propia Windows.H:

inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);
    return result;
}

template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);
    return result;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top