Bonjour,

J'ai écris une fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
template< typename Functor >
    void preprocess ( string& str , Functor cond )
qui a pour role d'enlever un caractère prédéfini encapsulé dans l'objet cond de la chaine de caractère str.

Exemple de fonctionnement attendu si le caractère à enlever est 'c' :

str = "cccccciiiiiiiiiccccccccccccccooooooccccccccccpppppp"

après appel à la fonction preprocess str devient :

str = "iiiiiiiiioooooopppppp"


Cependant le programme fonctionne mal c'est à dire qu'il n'enlève pas tous les caractères correspondant dans la chaine str, par moment il plante. Le débugger m'indique que la pile d'appel est dans l'état suivante après la réception de SIGSEV :

#0 77179F40 msvcrt!memmove() (C:\windows\system32\msvcrt.dll??)
#1 00000000 0x0044a8b5 in std::string::_M_mutate() (????)
#2 00000000 0x004495b8 in std::string::erase() (????)
#3 0041CD3F Parser::preprocess<Parser::IsCaracter<(char)99> >(str=@0x22ff0c, cond={<No data fields>})
#4 00401672 main(argc=1, argv=0x7a1008)


Mon code est le suivant :

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
34
35
#include <iostream>
#include <string>
 
using namespace std;
 
namespace Parser
{
    template< char caracter >
    struct IsCaracter
    {
        bool operator() ( char c ){ return c == caracter; }
    };
 
    template< typename Functor >
    void preprocess ( string& str , Functor cond )
    {
        for ( string :: iterator it = str.begin () ; it != str.end () ; it++ )
            if ( cond ( *it ) )
                str.erase ( it );
    }
}
 
int main(int argc, char *argv[])
{
    string s;
 
    while ( true )
    {
        getline ( cin , s );
        Parser :: preprocess ( s , Parser :: IsCaracter< 'c' > () );
        cout << s << endl;
    }
 
    return 0;
}
Merci d'avance de votre aide.