Extraction de mots d'une chaîne

Extraction de mots d'une chaîne - C - Programmation

Marsh Posté le 15-02-2007 à 12:58:10    

:hello:  bonjour tlm
 
Je dois réaliser, en C, un programme qui doit permettre à partir d'une chaine de caractères d'extraire des mots selon des délimiteurs passés en paramètres.
 
Petit exemple,à partir de :
  >leprogramme "unechaine,àdécou-per" ",.-"
  je souhaite obtenir :
      >unechaine
      >àdécou
      >per
 
Mon problème majeur est que je n'ai pas de niveau en C ^^.
 
 
Malgré cela, j'ai une première ébauche (dans cette ébauche, chacun des délimiteurs est passé séparément en paramètre); j'utilise strtok() afin de découper la chaine.
int main(int argc, char *argv[])
{
  while(1){
     char * str="";    //str est une chaine de caractères à découper
     char * pch="";   //pch est une chaine : les caractères restant à découper
     char * delimiters[10];   //delimiters : les caractères utilisés pour découper str, 10 maximums
     int i=0;      
 
     str=argv[1];   //str reçoit la premier argument : la chaîne à découper
        //ensuite je boucle : chacun des autres paramètres est inscrit dans 'delimiters'
 for (i=1;i<=argc;i++) {
 delimiters[i]=argv[i+1];}
 
     //ensuite je découpe la chaine selon les délimiteurs
     pch = strtok(str,*delimiters);
     while (pch != NULL)
     {printf ("%s\n",pch);
       pch = strtok (NULL,*delimiters);}
   }
  return 0;
}
 
Donc voila mon problème : ça ne marche pas ^^
En plus, je souhaiterais passer tous les délimiteurs en tant qu'un seul paramètre ("*-," par exemple mais est-il possible dans ce cas de prendre l'espace comme paramètre ?
 
Le premier prototype du programme était :
 
int main(int argc, char *argv[])
{
  while(1){
     char str[500]; //fixer une longueur de texte max en nb de caracteres
     char * pch;
     const char * delimiters[10]; //fixer un nombre de délimiteurs max
 
     printf("Veuillez entrer le texte : " );
     gets(&str);
     printf("Veuillez entrer les delimiteurs : " );
     gets(&delimiters);
     
     pch = strtok(str,delimiters);
     while (pch != NULL)
     {printf ("%s\n",pch);
       pch = strtok(NULL,&delimiters); }
  }
  return 0;
}
------> ceci marche, mais je veux passer la chaine à découper et les délimiteurs en paramètres !
Merci d'avance à ceux qui sont doués en C ^^

Message cité 1 fois
Message édité par lamorkytu le 15-02-2007 à 12:59:08
Reply

Marsh Posté le 15-02-2007 à 12:58:10   

Reply

Marsh Posté le 15-02-2007 à 14:31:53    

Ca devrait être char delimiters[10], pas char * delimiters[10]. Tu veux un tableau de 10 chars, pas un tableau de 10 char *. Et puis gets() c'est mal car tu ne contrôles pas le nombre de charactères lus ; utilises plutôt fgets().

Reply

Marsh Posté le 17-02-2007 à 13:21:39    

matafan a écrit :

Ca devrait être char delimiters[10], pas char * delimiters[10]. Tu veux un tableau de 10 chars, pas un tableau de 10 char *.


Oui mais t'as pas remarqué qu'il stocke dans son tableau "delimiters" les pointeurs "argv[i]" ? En fait, niveau syntaxe c'est correct (il stocke un pointeur dans un tableau de pointeurs)... c'est au niveau "logique" que c'est pas bon
 

lamorkytu a écrit :

Code :
  1. char * delimiters[10];   //delimiters : les caractères utilisés pour découper str, 10 maximums
  2.         //ensuite je boucle : chacun des autres paramètres est inscrit dans 'delimiters'
  3. for (i=1;i<=argc;i++) {
  4. delimiters[i]=argv[i+1];
  5. }



 
En faisant ça, si tu passes  "+ - ;" à ton programme, t'auras :

  • delimiters[1] contient "+"
  • delimiters[2] contient "-"
  • delimiters[3] contient ";"

(au passage t'auras sauté "delimiters[0]" ce qui est dommage)
 
Alors qu'en fait, il faudrait que "delimiters[0]" contienne '+', "delimiters[1]" contienne '-' et "delimiters[2]" contienne ';' (tu remarqueras les guillemets simples montrant ici des caractères et non des chaînes de caractères) => fais un "man strtok()" pour mieux comprendre le contenu du paramètre "char *delim"


Message édité par Sve@r le 17-02-2007 à 13:35:17

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed