[C++]Remplacer une sous-chaine dans un string

Résolu/Fermé
Paul99 Messages postés 235 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 juin 2010 - 5 août 2008 à 12:09
 Grognon - 12 janv. 2009 à 16:19
Bonjour,
Je cherche à remplacer dans du texte de type string une chaine de caractères à chaque fois que celle-ci est trouvée.
Un exemple pour rendre ça clair : je suis Paul et je poste un message -> tu suis Paul et tu poste un message.
Admirez la conjugaison !
Voilà un essai de fonction :

string remplacement(string chaine, string aRemplacer, string parCa)
{
int pos = chaine.size() - aRemplacer.size();
while(chaine.find(aRemplacer) != string::npos)
{
pos = pos - 1;
if(chaine.find(aRemplacer) != string::npos)
{
ch.replace(pos, aRemplacer.size(), parCa);
pos = chaine.size() - aRemplacer.size();
}
}
return chaine;
}

Mais visiblement, le while est sans fin, et je ne vois pas pourquoi.

Merci d'acance !
A voir également:

8 réponses

Paul99 Messages postés 235 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 juin 2010 23
5 août 2008 à 12:19
Mais elle est normalement fermée : Quand il n'y a plus de sous-chaine à modifier, elle ne se répète plus, non ?
6
Paul99 Messages postés 235 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 juin 2010 23
5 août 2008 à 14:11
Super merci !
Ca marche !! J'ai reprit et adapté un peu le code que tu m'a donné.
3
simsou Messages postés 28 Date d'inscription lundi 4 août 2008 Statut Membre Dernière intervention 9 février 2010 4
5 août 2008 à 12:12
while est un boucle et il faut donc la refermer !
2
Paul99 Messages postés 235 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 juin 2010 23
5 août 2008 à 15:20
Oups, désolé, mon code amélioré ne fonctionnait pas. Je viens d'essayer avec ta version, le debugueur se fait bavard :

In file included from dico.h:6,
from code.h:5,
from main.cpp:4:
dico.cpp: In function ‘std::string rch(std::string, std::string, std::string)’:
dico.cpp:18: erreur: no matching function for call to ‘std::basic_string<char, std::char_traits<char>, std::allocator<char> >::replace(int&, int&, std::string&, size_t)’
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/basic_string.h:1194: note: candidats sont: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::replace(typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type, const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/basic_string.h:1217: note: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::replace(typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type, const std::basic_string<_CharT, _Traits, _Alloc>&, typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/basic_string.tcc:390: note: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::replace(typename _Alloc::rebind<_CharT>::other::size_type, typename _Alloc::rebind<_CharT>::other::size_type, const _CharT*,

Et ainsi de suite...


Si la suite du rapport peut aider il faut me le dire, mais ça m'étonnerait.
Sinon, la concaténation rajoute des caractères à la fin, mais ne transforme pas (enfin je pense, ne pas hésiter à me corriger !!). Et sinon, a quoi ressemble la technique des "itérateurs" ? Je ne vois pas vraiment...
En tous cas, merci !
2

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 août 2008 à 16:06
regarde le lien que je t'ai donné, et essai avec une autre fonction. Je suis étonné que ça ne fonctionne pas, car ce site est pas mal et documente bien la STL. Mais bon, les faits sont têtus !
La concaténation que je t'ai donnée fait ça : prendre le début de la chaine jusqu'au mot à remplacer, mettre à la suite le mot remplaçant, puis mettre la fin de la chaine à partir de la fin du mot à remplacer. En fait, c'est un peu barbare/brutale, ça consiste tout simplement à écraser la chaine initiale en y mettant des bouts d'elle même.
D'un autre coté, je ne suis pas sur que le replace() fasse autre chose au final (dans son code à lui).
Sinon, comme je te disais, tu utilise erase() pour effacer le mot à changer et insert() pour mettre le nouveau. Je pense que c'est ce que je ferai car étant le plus élégant après le replace().
Pour les itérateurs, regarde un peu sur le lien que je t'ai donnée, il y a certains exemples. Je trouve que c'est bien est puissant, mais lourd à mettre en œuvre pour ne l'utiliser que sur une ligne ou deux.
2
Paul99 Messages postés 235 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 juin 2010 23
6 août 2008 à 13:26
Ah oui d'accord, l'idée est bonne (même si c'est barbare !).

Je vais commencer par essayer d'appliquer la méthode erase/insert, qui m'a l'air plus simple à mettre en oeuvre, si ça coince je teste la concaténation, et sinon, effectivement, j'essaie les itérateurs.

Je ne connaisais pas la page sur les strings (en C++ !), mais effectivement, ça a l'ai clair et complet.

Bon, bein merci, j'essaie !
2
Paul99 Messages postés 235 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 16 juin 2010 23
6 août 2008 à 13:56
C'est bon (cette fois j'ai vérifié !!), la concaténation barbare fonctionne.
Merci pour l'astuce et pour le lien, qui va me servir !
2
T'aurai quand même pu poster la solution...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
5 août 2008 à 13:15
je ne comprend pas ton Algo, ensuite, à mon avis, le proto à utiliser est:
string& replace( size_type index, size_type num1, const char* str, size_type num2 ); (https://en.cppreference.com/w/cpp/string/basic_string/replace
string remplacement(string chaine, string aRemplacer, string parCa)
{
    int len = aRemplacer.size(),pos;
    while((pos=chaine.find(aRemplacer)) != string::npos)
    {
        ch.replace(pos, len, parCa,perCa.size());
    }
return chaine;
} 
mais je ne suis pas convaincu que tu puisse faire ça ainsi, à mon avis, il faut passer les itérateurs.
Sinon, tu peux aussi concaténé:
ch=ch.substr(0,pos)+parCa+ch.substr(pos+len/*,string::npos*/);
ou encore avec erase() et insert()
1