[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
Grognon - 12 janv. 2009 à 16:19
A voir également:
- Remplacer un caractère par un autre en c
- Caractère ascii - Guide
- Word remplacer un mot par un autre - Guide
- Remplacer disque dur par ssd - Guide
- Caractere speciaux - Guide
- Caractères spéciaux : comment taper des |—[©\½→}… - Guide
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
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 ?
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
5 août 2008 à 14:11
Super merci !
Ca marche !! J'ai reprit et adapté un peu le code que tu m'a donné.
Ca marche !! J'ai reprit et adapté un peu le code que tu m'a donné.
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
5 août 2008 à 12:12
while est un boucle et il faut donc la refermer !
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
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 !
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 !
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
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.
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.
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
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 !
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 !
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
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 !
Merci pour l'astuce et pour le lien, qui va me servir !
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
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
Sinon, tu peux aussi concaténé:
ch=ch.substr(0,pos)+parCa+ch.substr(pos+len/*,string::npos*/);
ou encore avec erase() et insert()
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()