Forum Programmation.c++ conversion d'un entier en chaîne?

Posté par  .
Étiquettes : aucune
0
2
juin
2007
bonjour,
je cherche comment faire une conversion d'un entier en une chaîne de caractères ou alors comment affecter un entier à une chaîne par exemple :
int numero;
char* chaine; comment affecter "numero" à "chaine"??
merci.
  • # Google n'est pas ton ami ?

    Posté par  (site web personnel) . Évalué à 3.

    Tu pourrais faire l'effort de lire un des nombreux tutoriels C/C++ disponibles sur le net avant de poster ici !

    Tu peux faire : sprintf(chaine,"%d",numero);

    à condition bien sûr que tu aies alloué pour la chaîne un nombre de caractères suffisant pour tous les chiffres de ton entier.
    Tu peux en outre contrôler le format (cadrage à gauche, compléter par des zéros...) : man sprintf
    • [^] # Re: Google n'est pas ton ami ?

      Posté par  . Évalué à 4.

      Je dirai même plus : utilise snprintf(). De cette façon, tu seras sûr que tu n'auras pas de débordement de tampon, même si tu n'as pas alloué une taille suffisante. snprintf() est conforme C99, et il est présent sur la plupart des systèmes.

      Je te laisse trouver comment calculer le nombre de chiffres d'un entier :-) (indice : log).

      Si la portabilité n'est pas un problème, utiliser asprintf() permet de ne pas se casser la tête avec l'allocation mémoire. Mais c'est une extension GNU, donc seulement glibc.
      • [^] # Re: Google n'est pas ton ami ?

        Posté par  (site web personnel) . Évalué à 1.

        on peut facilement recoder asprintf, et au passage, on peut meme l'ameliorer au niveau de l'API.

        char* strdup_(char* input)
        {
        char* ret = strdup(input);
        if (ret == NULL) {
        fprintf(stderr, "Out of memory, exiting - input was %s.\n", input);
        exit(EXIT_FAILURE);
        }
        return ret;
        }

        char * vasprintf_(const char *msg, va_list args)
        {
        char s[8192];
        vsnprintf(s, sizeof(s), msg, args);
        return strdup(s);
        }

        // _GNU_SOURCE's asprintf like, but
        // - doesn't need _GNU_SOURCE
        // - returns allocated string
        // - never returns NULL (prints failure and exit on out of memory)
        char * asprintf_(const char *msg, ...)
        {
        char * results;
        va_list arg_ptr;
        va_start(arg_ptr, msg);
        results = vasprintf_(msg, arg_ptr);
        va_end(arg_ptr);
        return results;
        }
        • [^] # Re: Google n'est pas ton ami ?

          Posté par  . Évalué à 2.

          Oui, ça se recode facilement - par contre, l'implém que tu donnes est pas forcément la meilleure... Notamment pour l'allocation en bloc de 8192 au lieu d'une allocation dynamique comme le fait l'asprintf() de la glibc.

          Par ailleurs, je suis pas persuadé que retourner la chaîne plutôt qu'un int soit une bonne chose ; il est intéressant d'avoir la taille allouée en retour... (Et puis, pour quelqu'un qui est habitué à coder du GNU, c'est une abomination d'avoir autre chose qu'un int retourné, de toutes façons :-P).

          http://www.gnu.org/software/gnulib/ fournit une version portable de asprintf() ainsi que de pas mal d'autres fonctions GNU, notamment les très pratiques error(), getline() et getdelim(). La bibliothèque fonctionne pour Windows, HP-UX, AIX, *BSD, Solaris et bien d'autres.
          • [^] # Re: Google n'est pas ton ami ?

            Posté par  (site web personnel) . Évalué à 1.

            l'implém que tu donnes est pas forcément la meilleure... Notamment pour l'allocation en bloc de 8192 au lieu d'une allocation dynamique comme le fait l'asprintf() de la glibc.

            c'est certes une implémentation qui me convient, tu peux te faire un peu plus chevrer et être plus dynamique mais concrètement comme ça, ça me va très bien.

            Par ailleurs, je suis pas persuadé que retourner la chaîne plutôt qu'un int soit une bonne chose ; il est intéressant d'avoir la taille allouée en retour... (Et puis, pour quelqu'un qui est habitué à coder du GNU, c'est une abomination d'avoir autre chose qu'un int retourné, de toutes façons :-P).

            c'est dommage, le fonctionnel saibien(tm).
  • # en C++, char* n'existe pas

    Posté par  (site web personnel) . Évalué à 3.

    Tu postes sur un sous-forum "c++", et non "c", et tu parles de char*.
    Hum.

    En C++, char* n'existe pas.

    A supprimer de ta mémoire, de même de sprintf ou snprintf, vestige du C. Prendre un bouquin sur le C++ (par exemple ceux-la http://c.developpez.com/cours/#cours-cpp , gratuits) et apprendre les bases.

    Pour répondre à la question :
    http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#(...)
    http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/#(...)

    #include < sstream >
    std::ostringstream SS; //Ton gestionnaire de flux
    SS << I; //I etant ton nombre
    std::string TaChaineDeCharacter=SS.str(); //Pour le mettre dans un string, mieux que du char*, ou tu peux garder ton gestionnaire de flux.
  • # Les FAQ, c'est bien aussi

    Posté par  (site web personnel) . Évalué à 2.

    http://c.developpez.com/faq/cpp/?page=strings#STRINGS_affect(...) (suivre le lien) =>
    std::ostringstream oss;
    oss << "toto" << 42;
    const std::string chaine = oss.str();

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.