Bonjour,
J'ai écris une fonctionqui a pour role d'enlever un caractère prédéfini encapsulé dans l'objet cond de la chaine de caractère str.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 template< typename Functor > void preprocess ( string& str , Functor cond )
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 :
Merci d'avance de votre aide.
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; }
Partager