Séparation des mots d'une chaine
Bonjour à tous,
Après avoir arrêté la programmation pendant environ un an et demi je m'y remets mais je dois avouer que je dois travailler pour retrouver mes réflex d'antan.
J'ai trouvé un exercice sur internet qui consiste à programmer une fonction qui prend en paramètre une chaine de caractère et qui retourne lors de chaque appel successif le mots successifs de la chaine initiale à condition de lui passer NULL en argument.
De mémoire cela ressemble à une fonction de la bibliothèque standard (strtok si je me souviens bien)
voici le code
Code:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#include <iostream>
#include <cstdlib>
#define MAX 80
using namespace std ;
// 23-06-07
// Programme permettant la saisie d'une chaine, puis son extraction mot par mot à la manière de la fonction
char* split_word(char*) ;
int main()
{
char* pchaine ;
char* display ;
int i = 0, count = 0 ;
pchaine = new char[MAX] ;
if(!pchaine)
{
cout << "Mémoire insuffisante ! " ;
exit(1) ;
}
cout << endl
<< "Saisissez votre chaine :"
<< endl ;
cin.getline(pchaine, MAX, '\n') ;
while (*(pchaine + i) != '\0') // boucle permettant de compter le nombre d'espace dans la chaine
{
if(*(pchaine + i) != ' ')
count++ ;
i++ ;
}
cout << split_word(pchaine) ; // affiche le premier mots
for(i=1 ; i <= count ; i++)
{
display = split_word(NULL) ;
cout<< endl
<< display
<< endl ;
delete [] display ;
}
return 0;
}
// fonction retournant le mot suivant d'une chaine initiale si on lui passe NULL en paramètre sinon recommence si on lui passe une
// chaine de caractères.
char* split_word(char* chaine_input)
{
static char* chaine_m ; // chaine mémorisée
char* buffer = NULL ; //chaine tampon pour raccourcir celle d'avant.
char* mot = NULL; // chaine de retour
int length=0, j=0 ;
if((chaine_input == NULL)) //on affiche le mot suivant si on reçoit NULL en paramètre
{
while(*(chaine_m + length) != ' ') // compte le nombre de caractères avant l'espace suivant
{
length++ ;
}
mot = new char[length] ; // on crée une chaine de la longueur du mot.
if (!mot)
{
cout << "Mémoire insuffisante" ;
exit(1) ;
}
for(j=0; j<length; j++)
{
*(mot + j) = *(chaine_m + j) ; // copie des lettre du mots dans *word
}
buffer = chaine_m ; // charge le tampon
j=0 ;
while (*(chaine_m+j) != '\0')
{
*(chaine_m + j) = *(buffer + j + length) ;
j++ ;
}
}
else // on sélectionne la chaine en entrée
{
chaine_m = chaine_input ;
}
cout << mot ;
return mot ;
} |
Je compile avec Code Block, pas de soucis la compilation marche bien, mais l'ennui c'est que le programme en lui même ne m'affiche aucune réponse, juste l'invite pour saisir la chaine de départ, mais il ne me la divise pas en mots successif avec la boucle for du main.
Suite à un rapide tour par le debugger, me montre que apparament les boucles et la fonction split_word s'effectuent bien.
Donc ne voyant pas d'où peut venir le problème, je me tourne vers vous qui m'avez tant de fois dépanner par le passé.
Si vous pouvez m'éclairer dans mon problème.
D'avance merci
Lvdnono