102 votes

snprintf et Visual Studio 2010

J'ai la malchance de devoir utiliser VS 2010 pour un projet, et j'ai remarqué que le code suivant ne se construit toujours pas en utilisant le compilateur non conforme aux normes :

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    char buffer[512];

    snprintf(buffer, sizeof(buffer), "SomeString");

    return 0;
}

(la compilation échoue avec l'erreur : C3861 : 'snprintf' : identifiant non trouvé)

Je me souviens que c'était déjà le cas avec VS 2005 et je suis choqué de voir que cela n'a toujours pas été corrigé.

Quelqu'un sait-il si Microsoft a l'intention de faire passer ses bibliothèques C standard en 2010 ?

1voto

Sandeep Datta Points 7344

Vous devez utiliser _snprintf . Ne manquez pas le trait de soulignement.

1voto

andertavares Points 11

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 est l'implémentation d'Insane Coding : http://asprintf.insanecoding.org/

Plus précisément, je travaillais avec du code hérité de VC++2008. À partir de l'implémentation d'Insane Coding (téléchargeable à partir du lien ci-dessus), j'ai utilisé trois fichiers : asprintf.c , asprintf.h y vasprintf-msvc.c . D'autres fichiers étaient destinés à d'autres versions de MSVC.

[EDIT] Pour être complet, leur contenu est le suivant :

asprintf.h :

#ifndef INSANE_ASPRINTF_H
#define INSANE_ASPRINTF_H

#ifndef __cplusplus
#include <stdarg.h>
#else
#include <cstdarg>
extern "C"
{
#endif

#define insane_free(ptr) { free(ptr); ptr = 0; }

int vasprintf(char **strp, const char *fmt, va_list ap);
int asprintf(char **strp, const char *fmt, ...);

#ifdef __cplusplus
}
#endif

#endif

asprintf.c :

#include "asprintf.h"

int asprintf(char **strp, const char *fmt, ...)
{
  int r;
  va_list ap;
  va_start(ap, fmt);
  r = vasprintf(strp, fmt, ap);
  va_end(ap);
  return(r);
}

vasprintf-msvc.c :

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "asprintf.h"

int vasprintf(char **strp, const char *fmt, va_list ap)
{
  int r = -1, size = _vscprintf(fmt, ap);

  if ((size >= 0) && (size < INT_MAX))
  {
    *strp = (char *)malloc(size+1); //+1 for null
    if (*strp)
    {
      r = vsnprintf(*strp, size+1, fmt, ap);  //+1 for null
      if ((r < 0) || (r > size))
      {
        insane_free(*strp);
        r = -1;
      }
    }
  }
  else { *strp = 0; }

  return(r);
}

Utilisation (partie de test.c fourni par Insane Coding) :

#include <stdio.h>
#include <stdlib.h>
#include "asprintf.h"

int main()
{
  char *s;
  if (asprintf(&s, "Hello, %d in hex padded to 8 digits is: %08x\n", 15, 15) != -1)
  {
    puts(s);
    insane_free(s);
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X