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 �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    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
    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 �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    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 �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    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
    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 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
    Il faut aussi v�rifier si l'�toile n'est pas en d�but de cha�ne, sinon...

  7. #7
    Membre �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    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?
    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 �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    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 �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
    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
    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 �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
    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 �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    Par d�faut
    Mais le compile me donne cette erreur

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

  13. #13
    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
    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 �clair�
    Inscrit en
    Mars 2008
    Messages
    296
    D�tails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 296
    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