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 :

remplacement d'une sous chaine par une autre sous chaine C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut remplacement d'une sous chaine par une autre sous chaine C++
    bonjour,
    Je veux faire un remplacement d'une sous chaine par une autre souschaine à plusieurs emplacements.
    voici mon 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
    #include <iostream>
    #include <string>
     
    using namespace std;
     
    int main(void)
    {
        string s = "abcerfg";
     
        s.replace(3, 2, "HHHHHHH");
        s.replace(5,1,"AAAAA");
     
        cout << s << endl;
        return 0;
    }
    ici je veux remplacer "er" par "HHHHHHH".
    et je veux remplacer "f" par "AAAAA"
    pour avoir un resultat "abHHHHHHHrAAAAAg"

    mais voici le resultat par le prog: "abcHHAAAAHHHHHfg"
    est-ce que vous avez une solution?
    merci

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Ben une fois que tu as effectué ton premier remplacement, les indices ont changé, et donc le 5 ne correspond plus à f, mais à un 'A' (parmi ceux que tu viens d'insérer)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Et les indices commencent à 0 pas à 1.

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Et les indices commencent à 0 pas à 1.
    Tout à fait, et son premier indice (3) correspond bien au 'e', et son second (5) correspond bien à la position initiale de 'f'. (ou il a édité son post depuis ta remarque?)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    est-ce qu'il y a une solution pour garder les indices?

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Oui!

    La solution la plus simple est de commencer par la correction qui est le plus loin dans la chaîne, comme ça les indices antérieurs ne sont pas faussés.

    La solution la plus robuste est de rechercher dans la chaîne l'endroit où commence la chaîne que tu veux remplacer et de faire ton replace ensuite. Il y a la fonction find pour cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <string>
     
    int main() {
     
      std::string s = "abcdefghij";
      s.replace(s.find("cde"), 3, "AHAHAHAH");
     
    }

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Le plus simple je sais pas, ça reste du bricolage. Simple sur un cas trivial comme ça, mais vite dépassé.
    Le mieux par contre serait de faire un chouilla d'algorithmique pour y parvenir. Rien de bien sorcier d'ailleurs.
    Un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::string Replace(std::string in, const std::string& toReplace, const std::string& replacement)
    {
      for( size_t i = 0, p = in.find(toReplace, i);
            p != std::string::npos;
            i = p + replacement.length(), p = in.find(toReplace, i)
          )
      {
        in.replace(p, toReplace.length(), replacement);
      }
      return in;
    }
    Le seul "trick" c'est de bien bouger le i pour ne pas finir en boucle infinie avec un appel comme Replace("toto", "to", "toto").
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    Oui!

    La solution la plus simple est de commencer par la correction qui est le plus loin dans la chaîne, comme ça les indices antérieurs ne sont pas faussés.

    La solution la plus robuste est de rechercher dans la chaîne l'endroit où commence la chaîne que tu veux remplacer et de faire ton replace ensuite. Il y a la fonction find pour cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <string>
     
    int main() {
     
      std::string s = "abcdefghij";
      s.replace(s.find("cde"), 3, "AHAHAHAH");
     
    }
    bon c'est dans le cas oü les séquences à modifier sont distinctes mais si j'ai des séqences ADN ça marche pas la fonction s.find("cde")!!.
    en plus moi j'ai plusieurs remplacements pas un seul donc le problème est un peu compliqué.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Tout à fait, et son premier indice (3) correspond bien au 'e', et son second (5) correspond bien à la position initiale de 'f'. (ou il a édité son post depuis ta remarque?)
    ici je veux remplacer "er" par "HHHHHHH".
    et je veux remplacer "f" par "AAAAA"
    pour avoir un resultat "abHHHHHHHrAAAAAg"

    mais voici le resultat par le prog: "abcHHAAAAHHHHHfg"
    est-ce que vous avez une solution?
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        s.replace(3, 2, "HHHHHHH");
    Avec ce machin il n'aura jamais "abHHHHHHHrAAAAAg" car ça commencera toujours par "abc..."

  10. #10
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Avec ce machin il n'aura jamais "abHHHHHHHrAAAAAg" car ça commencera toujours par "abc..."
    Ah effectivement, c'était donc là que se situait ta remarque, désolé.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  2. Réponses: 3
    Dernier message: 05/01/2007, 15h50
  3. Remplacer une sous chaîne par une autre
    Par Erakis dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 10/11/2006, 09h16
  4. remplacement d'une chaine par une autre
    Par zalalus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/07/2006, 10h09
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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