IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Conversion d'entiers et concaténation (itoa + strcat)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 31
    Par défaut Conversion d'entiers et concaténation (itoa + strcat)
    Bonjour,

    Je ne suis pas très familier des "subtilités" du C++ et j'ai un soucis avec la conversion et concaténation de chaînes de caractère. Voilà mon problème :

    J'ai deux int indépendants: 11 et 22
    je veux obtenir lun char* de la sorte : "11-22"

    Et ça, ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char* data;
    char converter [8];
     
    data = itoa(11, converter, 10);
    data = strcat(data, "-");	
    data = strcat(data, itoa(22, converter, 10));	
    printf("Data : %s", data);
    Ca m'affiche : Data : 2222.
    En fait ça marcherait si j'utilisais une variable (converter) différente dans chaque itoa... Sauf que j'ai un nombre variable d'entier à convertir, ça m'arrangerait de réutiliser le même "buffer" à chaque fois.

    PS : Ma chaîne data doit alimenter la fonction "send" d'un socket. Donc je ne peux pas jouer avec des "string" C++ je crois. Ou alors il faut que je cherche comment convertir un char* en string.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Premier conseil, passe par std::string (#include <string>) et std::stringstream (#include <sstream>):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       std::stringstream l_flux_str;
       std::string l_str;
       int i_1(11);
       int i_2(12);
       l_flux_str<<i_1<<"-"<<i_2;
       l_str = l_flux_str.str();
    Ensuite, si tu veux tout de même un buffer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char *p_str = l_str.c_str();
    Tu peux retrouver des infos sur la FAQ ou sur les tutoriels.

  3. #3
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut (ou plutot rebonjour xD)
    Pour rester dans un code style C (et oui, c'est du C que tu présente, pas du C++, en C++ on utilise des string comme le dis 3DArchi) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #define BUF_SIZE  32 // Un petit define, c'est pratique pour les tailles de buffer
     
    // On alloue le buffer, car si tu le fait pas c'est pas itoa qui va le faire
    char* data = (char*)malloc(sizeof(char) * BUF_SIZE);
     
    // On met 0 partout dans la buffer pour être certain que la chaine résultante sera terminée par un 0
    SecureZeroMemory(data, BUF_SIZE); // Manquera ptre un cast ici
     
    // On convertie le premier nombre
    itoa(11, data, 10);
     
    // On ajoute le "-"
    strcat(data, "-"); // Pas besoin du data = strcat, puisque data sera directement modifié
     
    // On calcul la taille de la chaine
    int i = strlen(data);
     
    // On convertie le seconde nombre
    itoa(22, data + i, 10); // les pointeurs c'est super drole, avec ce +i le résultat de la conversion est directement concacténé
    Quand tu aura fini de faire mumuse avec ton data, n'oublie pas de le libérer : free(data);

    EDIT : Pour le SecureZeroMemory, j'ai utilisé celui la partant du princique que tu es sous Windows avec Visual Studio 2005+, si c'est pas le cas elle sera pas forcément disponible, mais rassures-toi, tu peux toujours utiliser la fonction memset à la place : memset(data, 0, BUF_SIZE);

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Ah oui, autre chose, si c'est pour faire juste un printf derriere, tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("Data : %i-%i", 10, 22);
    La version C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Data : " << 10 << "-" << 22 << endl;
    ET si tu veux, tu as aussi la possibilité de faire un printf dans un buffer plutot que sur l'écran, regardes du coté de sprintf

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Syrus Voir le message
    PS : Ma chaîne data doit alimenter la fonction "send" d'un socket. Donc je ne peux pas jouer avec des "string" C++ je crois. Ou alors il faut que je cherche comment convertir un char* en string.
    J'avais pas vu la première fois. Mais, rien n'empêche d'utiliser un std::string. Pour aller de char* vers std::string, tu as les constructeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string ( const char * s, size_t n );
    string ( const char * s );
    Attention tout de même au '\0' terminal.
    Pour ton émission, donc du std::string au char, tu as string::c_str:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sendto(ma_socket,ma_str.c_str(),ma_str.length()...);
    Idem, attention au '\0' terminal.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    une dernière possibilité sans passer par les stringstream:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    std::string l_str;
    int i_1(11);
    int i_2(12);
    l_str = boost::lexical_cast<std::string>(i_1) + "-" + boost::lexical_cast<std::string>(i_2);

  7. #7
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Ca implique d'utiliser Boost, même si c'est une librairie puissante et répandue c'est très loin d'être standard.
    Pour un code aussi simple c'est vraiment inutile de s'encombrer d'une librairie aussi grosse.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Par défaut
    C'était plus pour la culture générale. Je suis d'accord avec toi que pour convertir des entiers en string dans cette méthode, l'intérêt d'utiliser boost est limité...

    PS : Il utilise des sockets, ça peut être intéressant d'aller faire un tours du côté de boost (asio).

  9. #9
    Membre averti
    Inscrit en
    Novembre 2004
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 31
    Par défaut
    Merci beaucoup pour votre aide.

    J'ai implémenté une solution à base de flux et de string (et conversion en char* pour mon socket).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutant mais pas trop] conversion string->entier
    Par Biosox dans le forum Débuter
    Réponses: 5
    Dernier message: 06/01/2006, 22h41
  2. [SQL Access] Conversion d'entier en chaîne
    Par Neilos dans le forum Access
    Réponses: 2
    Dernier message: 17/06/2005, 10h58
  3. Conversion ascii - entier
    Par Jbx 2.0b dans le forum Général Python
    Réponses: 3
    Dernier message: 15/03/2005, 19h23
  4. [String] Conversion vers entier
    Par Javatator dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 19/08/2004, 15h59
  5. Réponses: 6
    Dernier message: 16/05/2004, 19h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo