Je suis assez malheureux d'être bloqué à l'aide de VS 2010 pour un projet, et j'ai remarqué que le code suivant ne se construit toujours pas à l'aide du compilateur non conforme aux normes:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(échoue la compilation avec l'erreur: C3861: 'snprintf': identifiant introuvable)
Je me souviens que c'était le cas avec VS 2005 et je suis choqué de voir qu'il n'a toujours pas été corrigé.
Est-ce que quelqu'un sait si Microsoft envisage de déplacer ses bibliothèques C standard en 2010?
c
visual-studio-2010
Andrew
la source
la source
Réponses:
Petite histoire: Microsoft a finalement implémenté snprintf dans Visual Studio 2015. Sur les versions antérieures, vous pouvez le simuler comme ci-dessous.
Version longue:
Voici le comportement attendu pour snprintf:
Les versions antérieures à Visual Studio 2015 n'avaient pas d'implémentation conforme. Il existe à la place des extensions non standard telles que
_snprintf()
(qui n'écrit pas de terminateur nul en cas de débordement) et_snprintf_s()
(qui peut appliquer une terminaison nulle, mais renvoie -1 en cas de débordement au lieu du nombre de caractères qui auraient été écrits).Solution de secours suggérée pour VS 2005 et versions ultérieures:
la source
snprintf
ne fait pas partie de C89. C'est standard uniquement dans C99. Microsoft n'a pas de plan prenant en charge C99 .(Mais c'est aussi standard en C ++ 0x ...!)
Voir les autres réponses ci-dessous pour une solution de contournement.
la source
_snprintf
est une fonction non sécurisée qui se comporte différemmentsnprintf
(elle n'ajoute pas nécessairement un terminateur nul), donc le conseil donné dans cette réponse est trompeur et dangereux.Si vous n'avez pas besoin de la valeur de retour, vous pouvez également définir simplement snprintf comme _snprintf_s
la source
Je pense que l'équivalent Windows est
sprintf_s
la source
sprintf_s
se comporte différemment desnprintf
.Un autre remplacement sûr de
snprintf()
etvsnprintf()
est fourni par ffmpeg. Vous pouvez consulter la source ici (suggéré).la source
J'ai essayé le code de @Valentin Milea mais j'ai des erreurs de violation d'accès. La seule chose qui a fonctionné pour moi était l'implémentation d'Insane Coding: http://asprintf.insanecoding.org/
Plus précisément, je travaillais avec le code hérité de VC ++ 2008. De la mise en œuvre de Insane de codage (peut être téléchargé à partir du lien ci - dessus), j'ai utilisé trois fichiers:
asprintf.c
,asprintf.h
etvasprintf-msvc.c
. Les autres fichiers concernaient d'autres versions de MSVC.[EDIT] Par souci d'exhaustivité, leur contenu est le suivant:
asprintf.h:
asprintf.c:
vasprintf-msvc.c:
Utilisation (partie de
test.c
fourni par Insane Coding):la source