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 :

modifier une chaine


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut modifier une chaine
    Bonjour,

    Je voudrais modifier ma chaine de caractere si elle contient une etoile et qu'il ny a pas de point devant l'etoile

    ex :
    toto_*_titi
    je voudrais ajouter un point . devant l'etoile
    toto_.*_titi
    attention il peut y avoir plusieurs etoile :
    toto_*_titi* -> toto_.*_titi.*
    si il y a un point devant l'etoile rien modiffier
    toto_.*_titi -> toto_.*_titi
    merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu dois pouvoir t'en sortir avec des expressions régulières, non?

    Sinon, ca dépend comment tu représente ta chaîne, si tu modifie ta chaîne ou tu produit une nouvelle chaîne résultat, etc... Selon le cas, tu peux faire soit des recherches/remplacer, soit des recopies par token...

  3. #3
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    je voudrais le resultat dans une variable
    recherche de "*",
    verifier si il y a un point sur le caractere juste avant
    si il n'y en a pas remplacer par ".*"

    merci

  4. #4
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    rx contient une chaine avec peut etre des *
    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
    //jusque la fin de la variable
    while ( ??? )
    {
       //recherche  1er *
       std::string::size_type rxpos=rx.find("*");
     
      //verifier si il y a un point juste avant
      if (rx.substr(rxpos-1,rxpos) == ".")
      {
                //remplacer * par .*
    	rrx=rx.substr(rxnpos,rxpos);
     
    	rxnpos = rxpos;
      }
     
    }
    est ce que ceci vous parez correct?
    merci

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Sur cette idée, il faut traiter le premier token en dehors de la boucle (juste avant), ce qui te donne la condition à ton while (!=npos) et permet de traiter la chaîne débutant par '*'.
    Idem pour le dernier token.

  6. #6
    Membre émérite
    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
    Points : 2 799
    Points
    2 799
    Par défaut
    Il faut aussi vérifier si l'étoile n'est pas en début de chaîne, sinon...

  7. #7
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    c'est quoi un token? le 1er test?

    j'ai une erreur
    'substr' : cannot convert parameter 1 from 'class std::basic_strin
    utiliser un Remplace n'est pas mieux?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rxx.Remplace ('*',".*");
    est ce que c'est mieux comme ca?
    mais jai toujours l'erreur ci dessus
    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
    std::string rxnpos = 0;
    std::string rrx;
     
    std::string::size_type rxpos=rx.find("*");
     
    	while (rx != rxpos)
    	{
    		std::string::size_type rxpos=rx.find("*");
     
    		if (rx.substr(rxpos-1,rxpos) == ".")
    		{
    			rrx = rx;
    			rrx=rx.substr(rxnpos,rxpos);
    			rxnpos = rxpos;
    		}
    	}
     
    	return rrx;
    }
    merci

  8. #8
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    je suis bloquer ici

    je suis pas sure de la condition du while et je ne sais pas si le reste fonctionne

    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
    std::string rxnpos;
    std::string rrx;
     
    std::string::size_type rxpos=rx.find("*");
     
    	while (rxpos!=rxnpos)
    	{
    		if (rx.substr(rxpos-1,rxpos) == ".")
    		{
    			rrx=rx.substr(rxnpos+1,rxpos);
    			rxnpos = rxpos;
    		}
     
    		std::string::size_type rxpos=rx.find("*");
    	}
    merci

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    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
    16
    17
    18
    19
    20
    std::string str = "*abc*.**def";
    // 1e recherche
    size_t pos = str.find('*');
     
    // Tant qu'on trouve une étoile
    while (pos != std::string::npos)
    {
    	// pos == 0 => Si étoile en début (ne pas faire str[-1] !!)
    	// On regarde si il y a un '.' juste avant l'étoile 
    	if ((pos == 0) || (str[pos - 1] != '.'))
    	{
    		// On insert le '.' juste avant l'étoile
    		str.insert(pos, ".");
    		// On incrémente la position car il y a eu une insertion
    		++pos;
    	}
     
    	// On cherche les autres étoiles à partir du caractère après l'étoile et rebelotte
    	pos = str.find('*', pos + 1);
    }

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Trunks 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
    13
    14
    15
    16
    17
    18
    19
    20
    std::string str = "*abc*.**def";
    // 1e recherche
    size_t pos = str.find('*');
     
    // Tant qu'on trouve une étoile
    while (pos != std::string::npos)
    {
    	// pos == 0 => Si étoile en début (ne pas faire str[-1] !!)
    	// On regarde si il y a un '.' juste avant l'étoile 
    	if ((pos == 0) || (str[pos - 1] != '.'))
    	{
    		// On insert le '.' juste avant l'étoile
    		str.insert(pos, ".");
    		// On incrémente la position car il y a eu une insertion
    		++pos;
    	}
     
    	// On cherche les autres étoiles à partir du caractère après l'étoile et rebelotte
    	pos = str.find('*', pos + 1);
    }
    En général, j'ai tendance à sortir le cas pos==0 du while. Mais, bon, c'est peut être une mauvaise habitude...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    En effet, on pourrait, ce qui accélererait le résultat, mais en contre-partie ça fait une redondance de code, ce qui n'est pas forcément génial si le corps du if est plus gros.
    A voir selon les exigences de chaque situation ...

    Après, il y a la façon Boost.Regex qui est plus sexy (simulation du sed) mais cette version STL devrait te satisfaire

    En occurrence, ça donnerait:

    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
    std::string str = "*abc*.**def";
    size_t pos = str.find('*');
     
    if (pos == 0)
    {
    	str.insert(pos, ".");
    	pos = str.find('*', pos + 2);
    }
     
    while (pos != std::string::npos)
    {
    	if (str[pos - 1] != '.')
    	{
    		str.insert(pos, ".");
    		++pos;
    	}
     
    	pos = str.find('*', pos + 1);
    }
    Perso, je préfère la 1e solution, le gain de performance dans cet exemple est minime par rapport à la redondance et clarté du code.

  12. #12
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    Mais le compile me donne cette erreur

    'insert' : 8 overloads have no legal conversion for 'this' pointer
    merci

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par cortex59 Voir le message
    Mais le compile me donne cette erreur



    merci
    La chaine est-elle bien un std::string? N'est-elle bien non constante?

  14. #14
    Membre régulier
    Inscrit en
    Mars 2008
    Messages
    296
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Points : 103
    Points
    103
    Par défaut
    OUI ct cette erreur
    merci

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

Discussions similaires

  1. Fonction qui modifie une chaine de caractère
    Par condor_01 dans le forum Débuter
    Réponses: 7
    Dernier message: 05/11/2007, 18h32
  2. Réponses: 1
    Dernier message: 10/04/2007, 23h29
  3. [VB.NET] Modifier une chaine de connextion
    Par hemipsy dans le forum Accès aux données
    Réponses: 4
    Dernier message: 28/12/2006, 12h38
  4. Modifier une chaine de caractères lue dans une DB
    Par shinryu69 dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2006, 13h40
  5. Modifier une chaine de caractères ?
    Par Arkadius dans le forum Oracle
    Réponses: 2
    Dernier message: 13/04/2006, 16h21

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