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 :

impossible de convertir de 'const char *' en 'char *'


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Points : 139
    Points
    139
    Par défaut impossible de convertir de 'const char *' en 'char *'
    Bonjour,
    je veux faire une fonction split en c++.
    cette fonction me retourne un tableau de string
    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
    char **split( string str, char c )
    {
        int current = 0;
        char *tmp[MAXSTR];
        istringstream iss( str );
    string mot;
        const char * s;
    while ( getline( iss, mot, ';' ) )
    {
     
            tmp[current] = mot.data();
            current++;
            //s=mot.c_str();
    cout << mot << '\n';
    }
    return tmp;
    }
    le message d'erreur suivant me parait:
    impossible de convertir de 'const char *' en 'char *'

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Utilises un conteneur plutôt qu'un char** :
    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
    #include <list>
    #include <sstream>
    #include <string>
     
    std::list<std::string> split( std::string str, char c )
    {
       std::istringstream iss( str );
       std::string mot;
       std::list<std::string> resultat;
       while ( getline( iss, mot, c ) )
       {
          resultat.push_back(mot);
       }
       return resultat;
    }
    que tu peux appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
       std::list<std::string> lst = split("un;deux;trois;quatre",';');
       return 0;
    }
    Voire, tu peux carrément généraliser la fonction pour prendre un itérateur résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <sstream>
    #include <string>
    template<class output_iterator_t_>
    void split2( std::string const & str, char c, output_iterator_t_ out_)
    {
       std::istringstream iss( str );
       std::string mot;
       while ( getline( iss, mot, c ) )
       {
          *out_=mot;
          ++out_;
       }
    }
    et l'appeler ensuite sur des vecteurs, des listes ou un tableau :
    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
    #include <list>
    #include <iostream>
    #include <iterator>
    #include <vector>
    int main()
    {
       std::list<std::string> lst2;
       split2("un;deux;trois;quatre",';',std::back_inserter(lst2));
     
       std::vector<std::string> vect;
       split2("un;deux;trois;quatre",';',std::back_inserter(vect));
     
       std::string resultat[4];
       split2("un;deux;trois;quatre",';',resultat);
     
       return 0;
    }
    Avec des char** et consort, cela nécessiterait de gérer toi-même allocations en tout genre avec beaucoup de risques de bug derrière.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2008
    Messages : 354
    Points : 139
    Points
    139
    Par défaut
    Merci beacoup pour votre aide.
    Je veux afficher les élements de liste sur l'écran.
    j'ai essayé de faire un boucle
    while(list.end())
    mais il ne marche pas.
    SVP est ce que vous pouvez me donnez commznt je peut parcourir une liste comme vous m'avez défini.

  4. #4
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    A la main :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    #include <sstream>
    #include <string>
    template<class output_iterator_t_>
    void split( std::string const & str, char c, output_iterator_t_ out_)
    {
       std::istringstream iss( str );
       std::string mot;
       while ( getline( iss, mot, c ) )
       {
          *out_=mot;
          ++out_;
       }
    }
     
    #include <list>
    #include <iostream>
    int main()
    {
       std::list<std::string> lst;
       split("un;deux;trois;quatre",';',std::back_inserter(lst));
     
       std::list<std::string>::const_iterator it;
       for(it = lst.begin();it!=lst.end();++it)
       {
          std::cout<<(*it)<<"\n";
       }
       return 0;
    }
    ou avec la STL en utilisant un std::ostream_iterator :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <sstream>
    #include <string>
    template<class output_iterator_t_>
    void split( std::string const & str, char c, output_iterator_t_ out_)
    {
       std::istringstream iss( str );
       std::string mot;
       while ( getline( iss, mot, c ) )
       {
          *out_=mot;
          ++out_;
       }
    }
     
    #include <list>
    #include <iostream>
    #include <algorithm>
    #include <iterator>
    int main()
    {
       std::list<std::string> lst;
       split("un;deux;trois;quatre",';',std::back_inserter(lst));
     
       std::copy(
          lst.begin()
          ,lst.end()
          ,std::ostream_iterator<std::string>(std::cout,"\n")
       );
     
       return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ou encore en plus efficace (pas de flux) ... http://www.developpez.net/forums/d23...e/#post2842014
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2011, 10h57
  2. Réponses: 3
    Dernier message: 18/06/2009, 18h30
  3. Réponses: 1
    Dernier message: 28/03/2009, 18h23
  4. Réponses: 2
    Dernier message: 29/12/2008, 18h49
  5. Réponses: 5
    Dernier message: 05/09/2008, 17h26

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