Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Il y a 74 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Explode d'un String en C/C++

 
n°11417
Nyphel
Profil : Jeune recrue
Posté le 10-02-2005 à 16:29:27  profilanswer
 

Bien le bonjour !
 
Actuellement, je lis un fichier .txt ligne à ligne.
Lorsque je récupère une ligne, j'ai besoin de faire un explode selon le caractère espace, pour pouvoir analyser chaque mot de la ligne.
 
Une solution consisterait tout simplement en lire les mots d fichier, plutôt que les lignes...
Mais le problème se pose encore, car certains mots sont des dates (jj/mm/aaaa) et des heures (hh:mm:ss) que je souhaite analyser.
Il me faut les exploder selon le caractère '/' et ':'.
 
Je parviens à traiter la récupération des lignes, ou bien des mots du  fichier.
Par contre, je ne parviens pas à faire un explode sur ma chaine string récupérée (qu'elle représente une ligne ou un mot, le problème est le même).
 
Je ne parviens pas à trouver de fonction toute prete sur Internet.
Je ne sais pas comment parcourir un chaine string pour   rechrcher des sous-chaines, et donc je ne parviens pas à réaliser une telle fonction.
 
Exemple de ce que je recherche :  
10/12/2004 ------> 10
                 ------> 12
                 ------> 2004

n°11425
P-Y
Intermittent du troll
Profil : Vieux de la vieille
Posté le 11-02-2005 à 00:53:10  profilanswer
 

Pourtant c'est vraiment pas dur a recoder une fonction explode :/
J'ai code ca en 5 min sans meme tester, je garantis pas que ca marche nickel je me suis peut-etre merde dans un indice de chaine, mais en gros l'idee est la:
 
EDIT: voir post plus bas pour un code qui marche :o


Message édité par P-Y le 05-07-2005 à 18:26:07
n°11426
P-Y
Intermittent du troll
Profil : Vieux de la vieille
Posté le 11-02-2005 à 01:02:33  profilanswer
 

bon je viens de realiser que ca gere pas le parametre limit, mais si t'as compris le truc et que tu connais un peu le C tu devrais pouvoir rajouter ca en 2 minutes ;)

n°11427
Nyphel
Profil : Jeune recrue
Posté le 11-02-2005 à 01:56:37  profilanswer
 

Merci beaucoup :).
 
Je ne suis pas particulièrement doué, je suis encore en phase d'apprentissage/entrainement :).
 
Je n'ai pas su utiliser ce code source, car mon compilateur (dev-cpp) m'annonce des erreurs lors des 3 mallocs... Or je ne sais pas encore travailler avec la gestion de mémoire  :sweat: . Je ne sais donc pas arranger ce problème.
 

Code :
  1. res = realloc(res, ++nbstr * sizeof (char *));
  2. res[nbstr - 2] = malloc( (i-from + 2) * sizeof (char));
  3. res[nbstr - 1] = malloc(sizeof (char));


 
Il me dit : invalid conversion from 'void' to 'char*'.
 
En ce qui concerne la limite, j'espère que je saurai la gérer de moi-même,  
mais ce n'est pas trop ce qui m'ennuie pour le moment :).

n°11428
P-Y
Intermittent du troll
Profil : Vieux de la vieille
Posté le 11-02-2005 à 02:23:33  profilanswer
 

Ca pue dev-C++ alors, avec gcc ca marche tres bien sans les casts pour les mallocs :o
 
Bon plus serieusement, j'ai teste et corrige les erreurs vite fait, voila une version qui a l'air de bien marcher:

Code :
  1. char   **my_explode(char *str, char separator)
  2. {
  3.   char **res = NULL;
  4.   int  nbstr = 1;
  5.   int  len;
  6.   int  from = 0;
  7.   int  i;
  8.   int  j;
  9.   res = (char **) malloc(sizeof (char *));
  10.   len = strlen(str);
  11.   for (i = 0; i <= len; ++i)
  12.     {
  13.       if ((i == len) || (str[i] == separator))
  14.    {
  15.      res = (char **) realloc(res, ++nbstr * sizeof (char *));
  16.      res[nbstr - 2] = (char *) malloc((i - from + 1) * sizeof (char));
  17.      for (j = 0; j < (i - from); ++j)
  18.          res[nbstr - 2][j] = str[j + from];
  19.      res[nbstr - 2][i - from] = '\0';
  20.      from = i + 1;
  21.      ++i;
  22.    }
  23.     }
  24.   res[nbstr - 1] =  NULL;
  25.   return res;
  26. }


Attention pour les cas speciaux genre 2 separateurs d'affilee je pense pas que ca fasse ce qu'il faut, mais meme remarque que pour la limite ca se rajoute en 2 min, et puis ca te fera un bon exercice ;)


Message édité par P-Y le 11-02-2005 à 02:36:54
n°11429
Nyphel
Profil : Jeune recrue
Posté le 11-02-2005 à 02:37:57  profilanswer
 

:love:  
Merci baucoup !
 
Je rencontre un dernier soucis.
voici mon programme de test :

Code :
  1. char *ma_chaine_de_test = "toto tata tutu titi";
  2. char separateur = ' ';
  3. char **resultat_explode;
  4. resultat_explode=my_explode(ma_chaine_de_test, separateur);
  5. cout << "Resultat : " << resultat_explode[0] << endl;
  6. cout << "Resultat : " << resultat_explode[1] << endl;
  7. cout << "Resultat : " << resultat_explode[2] << endl;
  8. cout << "Resultat : " << resultat_explode[3] << endl;


 
Ce qui m'affiche :

Code :
  1. Resultat : toto
  2. Resultat : tata
  3. Resultat : tutu
  4. Resultat : titi


 
Mais, si je désire faire un affichage en boucle du contenu de resultat_explode, donc quelque chose comme :

Code :
  1. for (int i=0, i < X , i++)
  2. { cout << resultat_explode[i] << endl; }


Je ne sais pas quelle est la condition à utiliser pour la sortie de boucle (à la place du X placé dans ma condition de fin de boucle).
 
Pourriez-vous me conseiller svp ?

n°11430
P-Y
Intermittent du troll
Profil : Vieux de la vieille
Posté le 11-02-2005 à 02:50:21  profilanswer
 

En fait vu que tu connais pas le nombre de tours a l'avance, tu peux pas te baser sur l'indice.  
Donc la solution (enfin les, y en a plusieurs possible comme bien souvent en prog )c'est  
-De mettre un element en plus qui vaut NULL (ce que j'ai fait), et dans ta boucle tu fais  :
    for (int i=0, resulat_explode[i] != NULL, i++)
      { cout << resultat_explode[i] << endl; }
-ou de passer un entier par adresse a my_explode, que tu remplis avec i avant de sortir, comme ca l'entier vaut le nombre d'elements a la sortie et tu as ton nombre d'elements ;)
 
Bon j'espere que ca ira pour ce soir, la faudrait quand meme que j'aille me coucher j'ai cours demain :lol:
 
bon courage ;)


Message édité par P-Y le 11-02-2005 à 02:51:11
n°11431
Nyphel
Profil : Jeune recrue
Posté le 11-02-2005 à 02:55:31  profilanswer
 

Merci pour tout, je vais rester traailler tout ca moi ;)


Aller à :
Ajouter une réponse