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 :

Découper un const char*


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Inscrit en
    Septembre 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 206
    Par défaut Découper un const char*
    Bonjour,

    J'essaye de découper un const char* par rapport au caractere : contenu dans la variable.
    La variable contient une ligne sous la forme "Ligne : blablaabla".

    Je n'ai pas trouvé de méthode qui permet de le faire.

    Donc pour l'instant j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(contenu[i] != ':')
    {
    	/* Premiere partie avec le nom de la ligne */
    	temp[i] == contenu[i];
    	i++;
    }
    while(contenu[i] != '\0')
    {
    	/* Deuxieme partie avec le contenue */
    	temp2[i] == contenu[i];
    	i++;
    }
    Mais le probleme est que ça ne marche pas !
    Existerais t-il une autre solution svp ?

  2. #2
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Si tu fais du C++, tu pourrais utiliser des std::string.
    Cette classe contient les fonctions nécessaires à ce que tu veux faire.

    http://www.cplusplus.com/reference/string/string/

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    Citation Envoyé par BaStaub Voir le message
    Donc pour l'instant j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(contenu[i] != ':')
    {
    	/* Premiere partie avec le nom de la ligne */
    	temp[i] == contenu[i];
    	i++;
    }
    Mais le probleme est que ça ne marche pas !
    Existerais t-il une autre solution svp ?
    Dans le premier while comme c'est conçu tu vas faire exploser contenu !
    Comme un tableau de charactères est terminé par \0 , si tu ne trouves pas le charactère ':' est bien tu obtiens un dépassement de tableau et un while qui boucle indéfiniment.
    Sinon oui il est vraiment conseillé d'utiliser std::string

  4. #4
    Membre éclairé
    Homme Profil pro
    Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Inscrit en
    Septembre 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 206
    Par défaut
    C'est vrai, je n'avais pas pensé a la boucle infini

    Je vais essayé les std::string

    Merci

  5. #5
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Sinon, si tu veux te la jouer old-school, vas voir là :

    http://opengroup.org/onlinepubs/0079...sh/strtok.html

    La fonction strtok permet de découper une chaîne en fonction de délimiteurs (par exemple ':').

    Mais c'est vrai, tu es sur le forum C++ donc utilise les STL !

    Hadrien

  6. #6
    Membre éclairé
    Homme Profil pro
    Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Inscrit en
    Septembre 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 206
    Par défaut
    J'utilise maintenant les std::string mais je n'arrive pas à le séparer en 2.
    La ligne que je doit séparée (qui est contenue dans un fichier) est de cette forme :
    aaaaa : bbbbbbb
    Sauf que le ":" (qui est le caractere séparateur) n'est pas toujours a la même place.

    Je voulais essayé la méthode substr() mais apparemment, le deuxième paramètre correspond à la position du séparateur (à ce que j'ai compris)...

    Quelqu'un peut m'aider ?

  7. #7
    Membre éclairé
    Homme Profil pro
    Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Inscrit en
    Septembre 2008
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Spécialiste en Maintenance Applicative / Developpeur C#, VB, PL-SQL, T-SQL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 206
    Par défaut
    C'est bon j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* Trouve la position du caractere ":" dans la ligne */
    size_t found = line.find_first_of(":");
    /* Calcule la taille totale de la ligne */
    size_t size = line.length();
    size_t i = size - found;
    /* Copie la premiere partie de la ligne dans la variable temp */
    std::string temp = line.substr(0, i);
     
    if(line.find("Ligne") != std::string::npos)
    {
    	/* Traitement */
    }
    Donnez moi votre avis, au cas ou il ai plus simple

  8. #8
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Citation Envoyé par BaStaub Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(contenu[i] != ':')
    {
    	/* Premiere partie avec le nom de la ligne */
    	temp[i] == contenu[i];
    	i++;
    }
    while(contenu[i] != '\0')
    {
    	/* Deuxieme partie avec le contenue */
    	temp2[i] == contenu[i];
    	i++;
    }
    Mais le probleme est que ça ne marche pas !
    ...
    Changez le code à (notez la difference entre == et = ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(contenu[i] != ':')
    {
    	/* Premiere partie avec le nom de la ligne */
    	temp[i] = contenu[i];
    	i++;
    }
    while(contenu[i] != '\0')
    {
    	/* Deuxieme partie avec le contenue */
    	temp2[i] = contenu[i];
    	i++;
    }
    -- Steve

  9. #9
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par BaStaub Voir le message
    Donnez moi votre avis, au cas ou il ai plus simple
    Il me semble qu'il y a une petite erreur. Le code devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    size_t found = line.find(":"); 
    std::string temp = line.substr(0, found); // première partie
    std::string temp2 = line.substr(found+1, std::string::npos); // deuxième partie

  10. #10
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Ou plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::string temp = line.substr(0, found); // première partie
    if(line.size() > found) // vérifier qu'il y a une deuxième partie
       std::string temp2 = line.substr(found+1, std::string::npos);

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Code source de luc hermitte pour pouvoir découper une chaine selon des motifs qui se répètent.

    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
    template <typename OO, typename Sep> 
    OO split(std::string const& source, OO dest, Sep sep)
    {
        std::string::size_type p = 0;
        while (p != std::string::npos)
        {
            const std::string::size_type p2 = source.find_first_of(sep, p);
            if (p2 != std::string::npos) {
                *dest++ = source.substr(p, p2-p);
                p = p2 + 1;
            } else {
                *dest++ = source.substr(p);
                p = p2;
            }
        }
        return dest;
    }
    Exemple d'utilisation:

    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
    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <iostream>
     
    int main (int argc, char **argv)
    {
     
    #if 1
        std::vector<std::string> res;
        split("x=9;y=7", std::back_inserter(res), ";=");
        std::copy(
            res.begin(),res.end(),
            std::ostream_iterator<std::string>(std::cout,"\n"));
    #else
        split("x=9;y=7", std::ostream_iterator<std::string>(std::cout,"\n"), " ;=");
    #endif
     
     
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/10/2005, 12h11
  2. [Appli Console]Pb exec command ac fct system(const char *)
    Par Le_magicien999 dans le forum MFC
    Réponses: 2
    Dernier message: 16/08/2005, 16h07
  3. Conversion CString en const char*
    Par LRobi dans le forum MFC
    Réponses: 8
    Dernier message: 19/07/2005, 12h12
  4. Réponses: 13
    Dernier message: 06/03/2005, 15h21
  5. Pb d'nitialisation d'un const char*
    Par davkick dans le forum C++
    Réponses: 9
    Dernier message: 09/12/2004, 16h27

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