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 de chaîne de caractère


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Par défaut Remplacement de chaîne de caractère
    Bonjour,

    Je vous explique, sur le programme que l'on développe , on rentre une phrase dans un TEdit.
    J'ai installé par la suite deux TexBox, l'une sert à trouver ses caractères dans la chaine saisie pour les remplacer par ceux de la 2em TexBox.
    J'ai écrit sa mais sa ne fonctionne pas et je ne comprend pas


    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
    30
    31
    void __fastcall TForm1::Button5_remplaceClick(TObject *Sender)
    {
     int n=0;
     int k;
     char LettreRepere[80];
     int TailleRep =  Form1->Edit_retirer->Text.Length();
     if (TailleRep< 80 )
           for (int i=0 ; i<=TailleRep ; i++)
                    LettreRepere[i]=Form1->Edit_retirer->Text.c_str()[i];
     char LettreRemplace[80];
     int TailleRem = Edit_remplace->Text.Length();
     if (TailleRem< 80 )
           for (int i=0 ; i<=TailleRem ; i++)
                    LettreRemplace[i]=Form1->Edit_remplace->Text.c_str()[i];
     char ChaineConvertie[100];
     for (int i=0; texte[i]!=0; i++)
            {
             if( texte[i]==LettreRepere[0])
                    for (int j=0; j<TailleRep; j++)
                            if(texte[i+j]==LettreRepere[j])
                                    n++;
             k=0;
             if (n==TailleRep)
                    for (k; k<TailleRem; k++)
                            ChaineConvertie[i+k]=LettreRemplace[k];
                    else ChaineConvertie[i+k]= texte[i];
             k+=i;
            }
     ChaineConvertie[k]=0;
     Form1->Edit_chaineSaisie->Text=ChaineConvertie;
    }
    Merci d'avance pour votre aide!
    Pour un exemple plus concret, Voila le programme Exemple en pièce jointe.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Si vous opérez en C++, pourquoi diable utiliser des tableaux de caractères plutôt que des std::string et/ou des std::vector ? Vous cherchez vraiment les complications et les ennuis...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Tout à fait d'accord. Voici un exemple :

    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
    30
    31
    32
    33
    #include <iostream>
    #include <string>
     
    int main()
    {
    	std::string phrase("Bonjour monsieur");
    	std::string achercher("oum");
    	std::string aremplacer("ain");
     
    	if( achercher.size() != aremplacer.size() )
    		return 1; // Erreur, chaînes mal formées
     
    	std::string::const_iterator caractere1, caractere2;
    	caractere2 = aremplacer.begin();
    	for( caractere1 = achercher.begin(); caractere1 != achercher.end(); caractere1++)
    	{
    		size_t lookHere = 0;
    		size_t foundHere;
    		std::string from(caractere1,caractere1+1);
    		std::string to(caractere2,caractere2+1);
     
    		while((foundHere = phrase.find(from, lookHere)) != std::string::npos)
    		{
    			phrase.replace(foundHere, from.size(), to);
    			lookHere = foundHere + to.size();
    		}
    		caractere2++;
    	}
     
    	std::cout << phrase << std::endl;
     
        return 0;
    }
    Ce programme affiche "banjair nansieir". C'est pas le pied au niveau performance mais je doute que ça soit vraiment important ici.

  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
    Remplacer une chaine par un autre ou un caractère par un autre dans une chaine : std::string::replace(), dans <string>

    Ramplacer un caractère par un autre dans un vector<char> : std::replace, dans <algorithm>.

    Et pour faire un remplacement du type du second mais plus général, on peut soit utiliser std::replace dans une boucle (pas forcément une bonne idée), soit utiliser std::transform avec un foncteur bien choisi:

    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
    30
     
    #include <algorithm> // pour std::transform
    #include <stdexcept> // pour std::invalid_argument
     
    struct replace_all_functor
    {
      std::string m_in;
      std::string m_out;
     
      replace_all_functor(const std::string& in, const std::string& out)
      : m_in(in), m_out(out)
      {
        if (m_in.length() != m_out.length())
        {
          throw std::invalid_argument("in et out doivent faire la même taille");
        }
      }
     
      char operator()(char in)
      {
        std::size_t pos = m_in.find(in);
        return (pos == std::string::npos ? in : m_out[pos]);
      }
    };
     
    template <class InIt, class OutIt>
    void replace(InIt first, InIt last, OutIt out, const std::string& from, const std::string& to)
    {
      std::transform(first, last, out, replace_all_functor(from, to));
    }
    L'algorithme est nécessairement en O(n^2) (std::transform --> O(n) + recherche dans la chaine m_in en O(n) aussi). Il est possible de modifier le foncteur pour le passe en O(n), en construisant une liste de correspondance entre les caractères à remplacer et les caractères de remplacement, mais le code devient nettement moins trivial, et ce n'est pas toujours possible.

    Attention à la locale courante : en fonction de celle-ci, il peut être avantageux de passer d'abord les chaines en std::wstring (double attention : à moins qu'il n'ai été corrigé, l'article de la FAQ C++ qui traite de ce point particulier contient une erreur ; je vous engage plutôt a lire mon article sur le sujet)
    [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 Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Joli, mais le pauvre btsIris59 va être perdu

  6. #6
    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 jblecanard Voir le message
    Joli, mais le pauvre btsIris59 va être perdu
    C'est pour ça que j'ai écrit le code en entier. Comme ça, il peut le copier sans vergogne
    [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.

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

Discussions similaires

  1. [MySQL] Remplacer une chaîne de caractères dans une base de données
    Par Furius dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/11/2013, 21h06
  2. Remplacer une chaîne de caractère dans un gros fichier
    Par dosilbr dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 06/03/2007, 13h38
  3. [SQL] Remplacement de chaîne de caractères
    Par squal29 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/08/2006, 00h49
  4. Réponses: 8
    Dernier message: 15/07/2006, 18h59
  5. Remplacer une chaîne de caractères dans une base
    Par Furius dans le forum Requêtes
    Réponses: 4
    Dernier message: 19/10/2005, 23h03

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