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 :

enlever un caractere redondant


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut enlever un caractere redondant
    Bonjour,

    Mon problème est que je dispose d'une chaine de caractère( de type string) telle que : a,i,o,p

    Et lorsque j'ajoute une autre chaine (string) telle que : a

    Je veux q'il me supprime le a qui apparait deux fois, et qu'il me donne à la fin : i,o,p

    Est ce qu'il existe une fonction qui fait ceci dans la bibliothèque ?

    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    C'est très simple : machaine.erase(0, 1);
    1er argument : numéro du caractère
    2eme argument : nombre de caractères à supprimer

    @+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    moi je ne veux pas indiquer le truc à supprimer je veux q'il trouve par lui même le truc redondons et le supprime

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    décembre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2010
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Tu fais une recherche de caractère, dans ce cas !

    pour i=0;i<tailedelachaine
    si chaine[i] == lettre
    supprimer chaine[i] (avec erase)

    Apres, tu adaptes ça comme tu veux ...

  5. #5
    Expert confirmé

    Inscrit en
    août 2006
    Messages
    3 876
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 876
    Points : 5 496
    Points
    5 496
    Par défaut
    Hia,

    Tu peux toujours acheter un ordinateur avec lecteur de pensées intégré.
    "Mon pied droit est jaloux de mon pied gauche.
    Quand l'un avance, l'autre veut le dépasser.
    Et moi, comme un imbécile, je marche !"
    [Raymond Devos]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Si l'ordre de ta chaine n'est pas important tu peux utiliser l'algorithme unique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    maChaine += maChaineAAjouter;
    std::string::iterator debut(maChaine.begin()),fin(maChaine.end());
    std::sort(debut, fin);
    std::string::iterator finUnique(std::unique(debut, fin));
    maChaine.erase(finUnique, fin);
    unique est une fonction qui, à partir d'une sequence triée(d'où l'utilisation de sort), met à la fin les doublons et renvoie un iterateur vers le premier doublon.
    Dernière modification par Invité ; 28/12/2010 à 17h26.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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
    Points : 4 548
    Points
    4 548
    Par défaut
    Si tu travailles sur des caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // si le caractère est déjà dans la chaine, alors
    // count va renvoyer au moins 1. 
    if (std::count(str.begin(), str.end(), c))
    {
      // du coup, on peut supprimer le caractère dans la chaine. 
      str.erase(std::remove(str.begin(), str.end(), c), str.end());
    }
    Si l'entrée est une chaine, ça devient plus complexe - il n'y a pas d'algorithme dans la librairie standard qui permet de faire ça simplement.

    Du coup, on va faire quelque chose du genre :

    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
     
    template <class Char>
    struct check_and_remove
    {
      private:
        std::basic_string<Char>& base;
      public:
        check_and_remove(std::basic_string<Char>& b) : base(b) { }
        void operator()(Char c)
        {
          if (std::count(str.begin(), str.end(), c))
          {
            str.erase(std::remove(str.begin(), str.end(), c), str.end());
          }
        }
    };
     
    template <class Char>
    std::basic_string<Char> traite_chaine(
        const std::basic_string<Char>& in, 
        const std::basic_string<Char>& chk)
    {
      std::basic_string<Char> out(in);
      std::for_each(chk.begin(), chk.end(), check_and_remove<Char>(out));
      return out;
    }
    Mis en template, parce qu'il n'y a pas de raison de se limiter à des std::string (et du coup, le code fonctionne aussi pour std::wstring, naturellement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      std::wcout << traite_chaine(L"abcd", L"ac") << std::endl;
      // affiche bd; le traitement s'eefectue sur des std::wstring
      std::cout << traite_chaine("abcd", "ac") << std::endl;
      // affiche bd aussi; mais fait le traitement sur des std::string
    [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.

Discussions similaires

  1. Enlever des caracteres en debut de chaine
    Par Mathieu.Nanoux dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/07/2007, 11h14
  2. Regexp : impossible d'enlever un caractere de fin à une chaine
    Par dukesgf dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 18/08/2006, 16h19
  3. Requete pour enlever des caracteres
    Par Drozo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/08/2006, 16h52
  4. [formulaire] enlever les champs redondants
    Par Mando dans le forum IHM
    Réponses: 7
    Dernier message: 23/01/2006, 17h56
  5. Enlever les espaces redondants....
    Par BFH dans le forum C
    Réponses: 3
    Dernier message: 24/10/2005, 18h00

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