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 :

eclatement d'un string


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut eclatement d'un string
    bonjour à tous,

    je me présente je m'appelle anthony et je suis nouveau dans votre forum je suis également débutant en c++ sinon je programme en perl et en tcl, je vous soumet un problème de débutant que je rencontre et qui j'espere n'aura pas été traité dans un autre sujet sinon je m'en excuse

    alors voila je voulais savoir comment parser un fichier qui contient des informations de ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    configuration1  exemple
    configuration2  exemple2 exemple3 exemple4
    configuration3  exemple5
    etc ...
    ma question est la suivante comment recuperer le 1er parametre "configuration" ainsi que le suivant "exemple" sachant que dans le cas de configuration2 il y a plusieurs valeur a recuperer, il se peut aussi que l'espace entre configuration et sa valeur soit superieur a 1 espacement.

    pour vous prouvez ma bonne foi j'ai déja essayé quelques methodes comme celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    istringstream iss(line);
    string key;
    string value;
    iss >> key >> value;
    cout << "key: " +key+ " value: " +value << endl;
    le probleme c'est que dans le cas de configuration2 il ne me recupere que le 1er argument exemple2.
    Existe t-il une façon d'eclater la string line suivant un motif quelquonque dans mon cas un ou plusieurs espacements.
    je vous remerci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour havoc50 et bienvenue sur le forum

    Je vois plusieurs possibilités pour résoudre ton problème (sans utiliser istringstream) :
    - Tu utilises une librairie qui dispose d'une fonction "split" (voir par exemple pour Qt : http://qt.developpez.com/doc/4.6/qstring/#split)
    - Tu crées toi même une fonction split. Il te suffit d'utiliser la fonction "find" de la STL (http://www.cplusplus.com/reference/string/string/find/) et la fonction "substr" qui permet d'extraire une sous-chaine (http://www.cplusplus.com/reference/s...string/substr/). N'oublie pas de gérer tes indices de début et fin de sous-chaine. Tu peux alors directement utiliser ta sous-chaine ou la stocker dans une liste (http://www.cplusplus.com/reference/stl/list/)

    Avec ces infos et la doc, tu devrais t'en sortir. N'hésite pas à poser du code si tu as des problèmes.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    salut gbdivers,

    merci beaucoup pour ton aide, je viens d'écrire un morceau de code qui me permet de spliter ma chaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string token (" ");  
    size_t found;
     
    found = line.find(token);
    string key;
    key = line.substr (0 , found + 1);
    cout << "position de l'espacement: " << int(found) << endl;
    cout << "valeur de key: " << key << endl;
    résultat:

    position de l'espacement: 14
    valeur de key: configuration1
    position de l'espacement: 14
    valeur de key: configuration2
    position de l'espacement: 14
    valeur de key: configuration3
    c'est impecable, ca me retourne le mot avant le 1er caractere d'espacement
    par contre je ne vois pas comment recuperer le reste parcque comme je disais l'espace entre la clef et la valeur peut varier donc pour ca il faudrait que je calcule le nombre d'espacement entre la fin de mon 1er mot et le second et ca me pose un petit problème, auriez-vous une idée ?

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Il te suffit d'ajouter une boucle pour lire tes différentes sous-chaines :

    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
    debut et fin = 0 // tes index mémorisant le début et la fin de la sous-chaine
    std::string key // ta clé
    std::list< std::string > valeurs // la liste des valeurs
     
    tant que (début est inférieur à la longueur de ta chaine)
    {
        fin = find(recherche à partir de la position "debut")
        si (début == 0)
            // c'est une clé
        sinon si (fin == début+1)
            // tu as 2 espaces qui se suivent
        sinon
        {
            souschaine = substr(entre début et fin)
            tu ajoutes ta sous chaines à ta liste (avec push_back() )
        }
    }
    A la fin de ce code, tu as lu 1 ligne et tu as ta clé dans une string (key) et tes valeurs dans une liste.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    voila ce que j'ai réussi a pondre et j'ai déja bien galeré mon probleme c'est que je n'arrive pas a afficher la valeur de sstring donc impossible de vérifier

    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
     
    // line est la chaine que je recupere dans le fichier
     
    int debut = 0, fin = 0;
    int size_str = line.length();
    string key;
    string sstring;
    std::list< std::string > value;
     
    while (debut < size_str)
    {
    	fin = line.find(debut);
     
    	if (debut == 0)
    	{
    		// hum
    	}
    	else if (fin == debut+1)
    	{
    		// rien faire
    	}
    	else
    	{
                    sstring = line.substr(debut, fin);
    		value.push_back(sstring);
    		cout << sstring << endl;
    	}
    }
    quand je lance le programme il rentre dans la boucle mais il reste bloqué sans rien afficher

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int debut = 0, fin = 0;
    Il est préférable d'écrire 1 déclaration par ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::list< std::string > value;
    (détail) c'est une liste de plusieurs "value" donc appelle la "values", c'est plus parlant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fin = line.find(debut);
    A quel moment tu dis que c'est le caractère "espace" que tu recherches ? Il y a plusieurs prototypes pour la fonction "find", tu n'as pas utilisé le bon.

    Quand tu as un problème de ce type (un algorithme qui ne fait pas ce que tu veux), il faut :

    1. Éteindre l'ordinateur !
    La conception de ton algorithme est-elle correcte ? Prend un feuille de papier et "exécute" à 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
    1 cas : 1 simple chaine "configuration value\0"
     
    initialisation :
    begin = 0 : * 
    line :      configuration value\0
    end = 0 :   *
     
    1er find :
    begin = 0 : * 
    line :      configuration value\0
    end = 13 :               *
     
    key = substr(begin à end-1)
     
    Avant le 2eme find :
    begin = 14 :              *          // on commence après la dernière position
    line :      configuration value\0
     
    Après le 2eme find :
    begin = 0 :              *
    line :      configuration value\0
    end = npos             // aucun espace trouvé = on prend jusqu'à la fin
     
    end = size
    value = substr(begin à end-1)
     
    Etc. etc.
    Ensuite tu testes avec plusieurs valeurs, puis avec une string qui contient plusieurs espaces, puis avec 1 espace en début de ligne, avec 1 ligne vide, avec 1 ligne contenant que des espaces, etc. (pour faire tous les cas de figure possible, même les erreurs potentielles)

    Quand tu as testé sur papier ton algorithme avec tous les cas possible, tu peux l'implémenter !

    2. Utilise le débogage ou des cout pour visualiser la valeur de tes index , le contenun des sous-chaines et savoir dans quel bloc des if tu entres à chaque cycle

    Ensuite, pour que tout soit parfait, tu mets ton code dans une fonction split

    Bon courage

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    boost::tokenizer ou boost::spirit aussi

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    merci a vous deux, j'vais tacher de réflechir et de pas trop me casser le cerveau ...

    J'ai regardé pour installer boost ca a pas l'air mal mais bon c'est pas ca qui va m'apprendre.

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    de pas trop me casser le cerveau
    Bouh. C'est pas comme ça qu'on apprend

    Plus sérieusement, si tu prends la (bonne) habitude de te poser et de réfléchir quand tu dois créer du code plutôt que de te jeter directement du le clavier, tu y gagnes (à plus long terme)

    J'ai regardé pour installer boost ca a pas l'air mal mais bon c'est pas ca qui va m'apprendre.
    De toutes façon, tu auras toujours plusieurs algorithmes pour résoudre un problème et plusieurs implémentations possible pour chaque algorithme...
    Je pense que comme tu débutes en C++, ton problème est vraiment intéressant pour travailler le C++ et la STL.
    En pratique, tu utiliseras ensuite des lib qui implémentent déjà ce genre de fonction (boost reste une des libs le plus souvent citée). En gros, une fois que tu auras créer une fois ta fonction "split" par toi-même, tu pourras passer directement à boost (tu pourrais peut être passer directement à boost sans t'embêter à créer par toi même mais je trouve que c'est formateur de résoudre soi même ce genre de problème, même s'il a déjà été résolu 1000 fois par d'autres)

    Bonne continuation

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    Hi !

    alors voila j'ai encore un peu avancé j'ai "réussi" du moins j'en suis pas loin a me faire un fonction split, cette dernière coupe la chaine suivant les espaces et positionne chaque mot dans une liste puis doit retourner cette liste

    voici la fonction

    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
     
    std::string split_str(std::string line)
    {
    	int begin = 0;
    	int end = 0;
    	list<string> liste;
     
    	for (;begin < int(line.length());begin++)
    	{
    		end = line.find(' ');
    		liste.push_back(line.substr(0, end));
    		while (line[end] == ' ') end++;
    		line = line.substr(end, line.length());
    		begin = line.find(' ');
    	}
            liste.push_back(line);
    	return liste;
    }
    déja ici j'ai un problème il me dit au moment du "return liste" que j'ai une erreur de converstion

    ensuite voici le code d'appel a la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list<string> liste;
    liste = split_str(line);
    ici il me dit no match for operator =
    il me semble avoir un peu avancé mais etant donné que je ne code que depuis 3 jours il y a encore des choses qui m'échappent ...

  11. #11
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Regarde tes types :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string split_str(std::string line)
    Le prototype de ta fonction retourne une string et tu essaies de retourner une liste...


    Petite information que les passages de paramètres : quand tu écris :
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (...) split_str(std::string line)
    (...)
    ou quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string split_str(...)
    (...)
    et
    tu recopies à chaque fois ta chaine ou ta liste. Si tu as beaucoup de boucle ou de grosses string, tu perds du temps pour rien.

    Préfère un passage par référence ici (voir la FAQ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void split(const string &in, list<string> &out)
    (...)
    par exemple.


    Pour le reste du code, je te laisse travailler avec la feuille de papier.

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    merci bien, je me suis servi de ta méthode avec les réfèrences par contre comment faut il faire pour parcourir une liste, c'est pas comme les tableaux je ne vois pas comment retourner un element en particulier

    je me suis aidé d'un site et j'ai fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    list<string>::iterator it;
     
    for (it = liste.begin(); it != liste.end(); it++)
    {
          cout << *it << endl;
    }
    mais ca me donne pas du tout le bon resultat donc je suppose que je n'utilise pas la bonne méthode pour parcourir ma liste

  13. #13
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Pour expliquer ton code :
    - list<string>::iterator est en quelque sorte un pointeur vers les éléments de la liste. *it permet d'accéder à l'élément actuellement pointé
    - list.begin() et liste.end() permet d'accéder au premier élément de la liste et à un élément hors de ta liste après le dernier élément (d'où le "it != liste.end()" pour vérifier que tu es sorti de la liste).
    - "it++" permet de passer a l'élément suivant (utilise plutot "++it")

    En gros, tu affiches bien chaque élément de ta liste...

    Donc le problème n'est pas lors de l'affichage mais dans le split

  14. #14
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    oui en effet ca vient bien de mon split car j'ai modifier ma fonction split pour ne recuperer que le mot précedent le separateur et il m'affiche la liste correctement, je suis vraiment bloqué je n'arrive pas a transformer ma string en une liste, j'ai résolu le problème pour le nombre d'espacement mais tout est a refaire, si l'un d'entre vous a une fonction split qui permet de stocker chaque mot entre separateur dans une liste j'apprecirai qu'il me montre sont code, j'ai vraiment envi d'apprendre mais la je cale ...

  15. #15
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Voici le code :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <iostream>
    #include <string>
    #include <list>
     
    using namespace std;
     
    void split(const string &in, list<string> &out)
    {
        // initialisation
        out.clear();
        unsigned int begin = 0;
        unsigned int end = 0;
     
        while (begin < in.size())
        {
            // on ignore les espaces du début
            while (begin < in.size() && in[begin] == ' ')
            {
                ++begin;
            }
     
            // on recherche l'espace suivant
            end = begin + 1;
            while (end< in.size() && in[end] != ' ')
            {
                ++end;
            }
     
            // on récupère la sous-chaine
            if (begin < in.size())
            {
                out.push_back(in.substr(begin, end-begin));
                begin = end + 1;
            }
        }
    }
     
    void print(const list<string> &in)
    {
        list<string>::const_iterator it;
        cout << "String list size: " << in.size() << endl;
        for (it = in.begin(); it != in.end(); ++it)
        {
              cout << "- \"" << *it << "\"" << endl;
        }
        cout << endl;
    }
     
    int main(int argc, char *argv[])
    {
        string line1 = "   configuration1  exemple";
        string line2 = "configuration2  exemple2 exemple3 exemple4";
        string line3 = "configuration3  exemple5";
        list<string> liste;
     
        split(line1, liste);
        cout << "line: \"" << line1 << "\"" << endl;
        print(liste);
     
        split(line2, liste);
        cout << "line: \"" << line2 << "\"" << endl;
        print(liste);
     
        split(line3, liste);
        cout << "line: \"" << line3 << "\"" << endl;
        print(liste);
    }
    Tu n'étais plus très loin

  16. #16
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    merci beaucoup, ca fonctionne a merveille et c'est exactement ce que je voulais ! j'ai encore une question a te poser du coup maintenant que j'ai ma liste je suis en train de coder une fonction lindex(liste, position); cette derniere retourne le postion element de la liste comme ca niquel je recupere facilement n'importe quel mot de ma liste si il existe pour le moment j'ai fais ceci qui ne fonctionne pas puisque je maintenant je sais comment parcourir une liste mais je ne sais pas quel position a chaque element

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    std::string lindex(const list<string> &in, int pos)
    {
    	int i = 0;
    	string value;
        list<string>::const_iterator it;
     
    	for (it = in.begin(); it != in.end(); ++it);
    	{
    		if (i == pos) value = *it;
    		i++;
    	}
    	return value;
    methode pour stocker le mot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string mot;
    mot = lindex(list, 0); // censé retourner le 1er element de la liste
    je me sert de iterator it mais ce dernier ne contient pas la position du mot dans la liste, sait tu comment retrouver un mot suivant sa position ? sinon le * devant it a quoi sert-il ? dans mon cas faut-il plutot utiliser un vecteur ou une liste ?
    je te remerci pour ton aide c'est vraiment sympa de ta part et j'avoue que je commence a prendre gout au c++ j'avais tenter le C y a un moment mais j'ai pas accroché plus que ca, en attendant une reponse je me replonge dans la doc sur la stl !!!

  17. #17
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Il te suffit d'ajouter une condition dans ton "for" pour tester si "i==pos" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    string at(const list<string> &in, int pos)
    {
    	int i = 0;
    	list<string>::const_iterator it;
     
    	for (it = in.begin(); it != in.end() && i!=pos; ++it, ++i);
    	{
    	}
    	if (it == in.end())
    		return "";
    	else
    		return *it;
    }
    J'ai renommé la fonction "at" par analogie avec vector::at(). Tu pourrais également utilisé vector à la place de list (ce n'est pas optimiser pour les ajouts mais dans ton cas, ça changerait pas grand chose)

    Bon courage pour la suite. Et n'oublie pas qu'il faut prendre le temps de bien faire les choses pour apprendre un langage.

  18. #18
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mars 2007
    Messages : 244
    Par défaut
    merci
    j'ai cependant modifié mon code j'utilise maintenant des vecteurs la place des listes.

  19. #19
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Un split générique et plus dans l'esprit (bon ou mauvais, à vous de juger) de la STL: 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. Comment eclater un string ?
    Par Djaydjay13 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/02/2010, 14h33
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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