Soy lo suficientemente desafortunado como para quedarme atascado usando VS 2010 para un proyecto, y noté que el siguiente código aún no se compila con el compilador que no cumple con los estándares:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(falla la compilación con el error: C3861: 'snprintf': identificador no encontrado)
Recuerdo que este es el caso de VS 2005 y me sorprende ver que aún no se ha solucionado.
¿Alguien sabe si Microsoft tiene planes de trasladar sus bibliotecas C estándar al año 2010?
c
visual-studio-2010
Andrés
fuente
fuente
Respuestas:
Breve historia: Microsoft finalmente implementó snprintf en Visual Studio 2015. En versiones anteriores, puede simularlo como se muestra a continuación.
Versión larga:
Aquí está el comportamiento esperado para snprintf:
Las versiones anteriores a Visual Studio 2015 no tenían una implementación conforme. En cambio, hay extensiones no estándar como
_snprintf()
(que no escribe un terminador nulo en el desbordamiento) y_snprintf_s()
(que puede imponer la terminación nula, pero devuelve -1 en el desbordamiento en lugar del número de caracteres que se habrían escrito).Respaldo sugerido para VS 2005 y posteriores:
fuente
snprintf
no es parte de C89. Es estándar solo en C99. Microsoft no tiene ningún plan que admita C99 .(¡Pero también es estándar en C ++ 0x ...!)
Consulte otras respuestas a continuación para obtener una solución.
fuente
_snprintf
es una función insegura que se comporta de manera diferente asnprintf
(no necesariamente agrega un terminador nulo), por lo que el consejo dado en esta respuesta es engañoso y peligroso.Si no necesita el valor de retorno, también puede definir snprintf como _snprintf_s
fuente
Creo que el equivalente de Windows es
sprintf_s
fuente
sprintf_s
se comporta de manera diferente asnprintf
.Otro reemplazo seguro de
snprintf()
yvsnprintf()
es proporcionado por ffmpeg. Puede consultar la fuente aquí (sugerido).fuente
Probé el código de @Valentin Milea pero tengo errores de violación de acceso. Lo único que funcionó para mí fue la implementación de Insane Coding: http://asprintf.insanecoding.org/
Específicamente, estaba trabajando con el código heredado de VC ++ 2008. De insana de Codificación de aplicación (se puede descargar desde el siguiente enlace), que utiliza tres archivos:
asprintf.c
,asprintf.h
yvasprintf-msvc.c
. Otros archivos eran para otras versiones de MSVC.[EDITAR] Para completar, su contenido es el siguiente:
asprintf.h:
asprintf.c:
vasprintf-msvc.c:
Uso (parte de
test.c
proporcionado por Insane Coding):fuente