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 :

Problème avec string::substr()


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut Problème avec string::substr()
    Bonjour,

    J'ai un code qui lit un fichier inspiré du XML et qui contient une fonction nettoyant ses lignes.

    Cette fonction supprime :
    - les espaces en trop aux 2 extrémités de la ligne
    - un éventuel signe '/' en fin de ligne (après nettoyage des espaces) pour les données de type path de dossiers

    Cela fonctionne bien, mais je voudrais utiliser substr à la place de 3 lignes de codes qui construisent la string nettoyée.

    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
    // Suppression d'éventuels espaces en début et fin d'une chaine, et d'un
    // éventuel caractère de séparation de path en trop en fin de chaine
    string clean(string chaine)
    {
        int begin = 0;
        int end = chaine.size()-1;
        if (end >= 0)
        {
            while (chaine[begin]==' ' && begin<end)
                begin++;
            while (chaine[end]==' ' && end>begin)
                end--;
            if (chaine[end] == '/')
                end--;
    // lignes à supprimer
            string returnString;
            for (int i=begin; i<=end; i++)
                returnString = returnString + chaine[i];
    // FIN lignes à supprimer
    // alternative avec substr()
    //        string returnString = chaine.substr(begin,end); // ligne qui plante
            cout << returnString << endl;
            if (returnString ==" ")
                returnString ="";
            return returnString;
        }
        else
            return "";
    }
    Avec la version substr(), cette fonction génère une erreur de lecture sur les lignes non précédées d'espaces, en n'affichant pas le dernier caractère '>' de ces lignes (lignes 1,5,7,14 ci-dessous), et n'enlève pas le dernier '/' du path s'il en contient un (ligne 9).

    Fichier enregistré en UTF-8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <scan_options>
            <
            autres balises....
            >
    </scan_options>
     
    <directories>
        <path>
            /home/user/dossier testé/
            <
            autres balises....
            >
        </path>
    </directories>
    Affichage avec le code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <scan_options>
    <
    autres balises....
    >
    </scan_options>
     
    <directories>
    <path>
    /home/user/dossier testé
    <
    autres balises....
    >
    </path>
    </directories>
    Affichage avec le code substr() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <scan_options
    <
    autres balises....
    >
    </scan_options
     
    <directories
    <path>
    /home/user/dossier testé/
    <
    autres balises....
    >
    </path>
    </directories
    Le fichier lu est en enregistré en UTF-8. Je me suis demandé si là n'était pas le problème, mais en l'enregistrant en latin-1, cela ne change rien pour les lignes sans espace au début ou le problème du '/', avec en plus des problèmes de reconnaissance de caractères sur les chemins de fichiers en caractères accentués...

    Un problème dans mon code avec mes variables int begin ou int end?

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    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 <string>
     
    std::string clean_string(const std::string in)
    {
      std::size_t begin = in.find_first_not_of("\t\n\r ");
      if (begin != std::string::npos) {
        std::size_t end = in.find_last_not_of("\t\n\r /");
        if (end != std::string::npos) {
          return in.substr(begin, end - begin + 1);
        } 
      } 
      // que des caractères blancs
      return std::string();
    }
    Ton erreur viens probablement du fait que le second paramètre de substr() est un nombre de caractères, pas une position.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    Merci, cela fonctionne parfaitement J'ai effectivement manqué ce petit "détail" dans la doc

    J'ai découvert pleins de trucs avec ce petit code : le npos, le size_t, le find_***_not_of, le string() pour renvoyer une chaine vide. Cela mesure le long chemin qui est encore à parcourir

    Sinon, pourquoi un size_t ?
    EDIT : parce que c'est le type renvoyé par la fonction...

    Si j'ai bien compris, le size_t est l'entier non signé le plus long disponible ?

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par spirzouf Voir le message
    Merci, cela fonctionne parfaitement J'ai effectivement manqué ce petit "détail" dans la doc

    J'ai découvert pleins de trucs avec ce petit code : le npos, le size_t, le find_***_not_of, le string() pour renvoyer une chaine vide. Cela mesure le long chemin qui est encore à parcourir

    Sinon, pourquoi un size_t ?
    EDIT : parce que c'est le type renvoyé par la fonction...

    Si j'ai bien compris, le size_t est l'entier non signé le plus long disponible ?
    On a eu un discussion récemment sur size_t et X::size_type (cf. http://www.developpez.net/forums/d11...tor-size_type/). En gros, size_t est le plus petit type qui permet de stocker la taille du plus gros objet qui peut être alloué dans le modèle de mémoire courant. Ce n'est pas tout à fait la même chose que le plus grand entier non signé disponible.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre confirmé
    Homme Profil pro
    Etudiant CNAM (DIE20)
    Inscrit en
    Janvier 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant CNAM (DIE20)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 151
    Par défaut
    merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/11/2010, 16h27
  2. Problème avec string
    Par kahn_onjy_bryce dans le forum Débuter
    Réponses: 20
    Dernier message: 14/06/2009, 13h48
  3. Petit problème avec String
    Par mhamedbj dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2007, 17h53
  4. Problème avec un substring
    Par yoda_style dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 11h29

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