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
snprintfno 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
_snprintfes 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_sfuente
sprintf_sse 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.hyvasprintf-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.cproporcionado por Insane Coding):fuente