Rechercher : dans
Par :

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

Dernière réponse le 12 jan 2009 à 16:19:43 Paul99, le 5 aoû 2008 à 12:09:35 
 Signaler ce message aux modérateurs

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 !

Configuration: Linux Fedora
Firefox 3.0.1

Meilleures réponses pour « [C++]Remplacer une sous chaine dans un string » dans :
Langage C - Les chaînes de caractères Voir Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

simsou, le 5 aoû 2008 à 12:12:11
  • +2

While est un boucle et il faut donc la refermer !

Répondre à simsou

2

Paul99, le 5 aoû 2008 à 12:19:37
  • +1

Mais elle est normalement fermée : Quand il n'y a plus de sous-chaine à modifier, elle ne se répète plus, non ?

Répondre à Paul99

3

Char Snipeur, le 5 aoû 2008 à 13:15:33
  • +1

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 ); (http://www.cppreference.com/cppstring/replace.html)

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() Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

4

Paul99, le 5 aoû 2008 à 14:11:01
  • +1

Super merci !
Ca marche !! J'ai reprit et adapté un peu le code que tu m'a donné.

Répondre à Paul99

5

Paul99, le 5 aoû 2008 à 15:20:38
  • +1

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 !

Répondre à Paul99

6

Char Snipeur, le 5 aoû 2008 à 16:06:04
  • +1

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. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

7

Paul99, le 6 aoû 2008 à 13:26:01
  • +1

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 !

Répondre à Paul99

8

Paul99, le 6 aoû 2008 à 13:56:39
  • +1

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 !

Répondre à Paul99

9

 Grognon, le 12 jan 2009 à 16:19:43

T'aurai quand même pu poster la solution...

Répondre à Grognon