[TP en C ] Rechercher mot dans chaîne caractère

Rechercher mot dans chaîne caractère [TP en C ] - C++ - Programmation

Marsh Posté le 24-11-2002 à 09:42:28    

"Le TP consiste dans un premier temps à rechercher un mot (ou motif) dans une chaine de caractère et le remplacer par un autre mot choisi auparavant.  
Ensuite,  faire cette même recherche et ce même remplacement pour un mot dans un fichier."
Je débute en C et je galère pour ce TP.
Merci à ceux ou celles qui voudraient bien m'aider !

Reply

Marsh Posté le 24-11-2002 à 09:42:28   

Reply

Marsh Posté le 24-11-2002 à 09:53:02    

Boyer-Moore?
http://www-igm.univ-mlv.fr/~lecroq/string/node14.html
ou d'autres:
http://www-igm.univ-mlv.fr/~lecroq/string/index.html
A+,


Message édité par gilou le 24-11-2002 à 09:53:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-11-2002 à 10:05:09    

gilou > joli :jap:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-11-2002 à 16:32:21    

T bien gentil mais je suis newbie alors faudrait peut etre que quelqu'un m'explique.Sinon moi je dis UP !!!!!
Merci d'avance car la je suis dans le trou total

Reply

Marsh Posté le 24-11-2002 à 17:45:32    

Il te faut utiliser la fonction  

Code :
  1. char *strstr( const char *string, const char *strCharSet );


strstr(ch,"DTC" );
elle renvoit un pointeur sur la 1ère sous-chaîne commençant par le 2ème argument "DTC" ou renvoit NULL si ya pas.
Le principe c'est de trouver où est le motif (par strstr), de recopier le début de la chaîne dans une autre, d'y concaténer le motif de remplacement puis le reste de la chaîne originale.
Hum, plus clairement :
ch="salut taratata54" et tu veux mettre "gzip" à la place de "tar"  :whistle:  
tu copies la debut dans ch2 -> ch2="salut "
tu rajoutes "gzip" -> ch2="salut gzip" avec strcat
puis tu termines -> ch2="salut gzipatata54"
sachant que strstr(ch,"tar" ) va renvoyer un pointeur sur le t de taratata54
 
bon d'accord c pas super clair  :sweat:  mais je doit avoir une vieille fonction qui traine dans mes sources, je vais te la poster pour t'aider


---------------
yo, nippon ichi
Reply

Marsh Posté le 24-11-2002 à 18:08:19    

voila, j'espère que ça va t'aider un peu
c'est peut être pas la meilleure méthode mais au moins ça marche

Code :
  1. // texte contient la chaine originale
  2. // str contient la chaine à remplacer
  3. // str2 contient le motif de remplacement
  4. char *c_ou,*c_ou_old,*resultat;
  5. int taille=0,taille_old=0,pb=0;
  6. c_ou=c_ou_old=texte;
  7. if((resultat=(char*)malloc(sizeof(char)))==NULL)  exit(1);
  8. while((c_ou=strstr(c_ou,str))!=NULL && pb==0) //c_ou pointe sur la 1ère sous-chaine commençant par str
  9. {
  10.  taille+=c_ou-c_ou_old+strlen(str2)+1; // taille totale de la nouvelle chaine après remplacement
  11.  if((resultat=(char*)realloc(resultat,sizeof(char)*taille))==NULL)
  12.  {
  13.   printf("DTC achete de la ram" );
  14.   pb=1;
  15.  }
  16.  else
  17.  {
  18.   memcpy(resultat+taille_old,c_ou_old,c_ou-c_ou_old); //copie la partie entre le dernier motif et le motif à remplacer
  19.   taille_old+=c_ou-c_ou_old;
  20.   memcpy(resultat+taille_old,str2,strlen(str2));  //copier le nouveau motif
  21.   taille_old+=strlen(str2);
  22.   c_ou_old=c_ou+strlen(str);
  23.   c_ou++;       // c_ou pointe sur un motif donc strstr ne va pas chercher + loin, donc on le force en allant un cran à droite
  24.  };
  25. };
  26. if (pb==0)
  27. {
  28.  taille+=(texte+strlen(texte))-c_ou_old+1;
  29.  if((resultat=(char*)realloc(resultat,sizeof(char)*taille))==NULL) //allouer pour copier la fin de la chaine
  30.   printf("DTC achete de la ram" );
  31.  else
  32.  {
  33.   memcpy(resultat+taille_old,c_ou_old,(texte+strlen(texte))-c_ou_old);
  34.   taille_old+=((texte+strlen(texte))-c_ou_old);
  35.   *(resultat+taille_old)='\0';         //placer le caractère de fin de chaine
  36.  };
  37. };
  38. // la nouvelle chaine modifiée est : resultat


Pour les fichier, c'est la même logique, ouvre l'original et en parallèle un autre en écriture. tu recopies jusqu'à trouver le motif que tu remplaces par le nouveau puis tu continues  :pt1cable:  
 
allez, bonne chance pour ton TP  :hello:


---------------
yo, nippon ichi
Reply

Marsh Posté le 24-11-2002 à 18:12:37    

t'es sympa mais on n'a dit qu'on faisait pas les devoirs des autres.
 
en plus un newbie va rien capter du tout: on reponds au gens en fonction de leurs connaissance
 
edit: en plus ta solution est loin d'etre tres propre


Message édité par Taz@PPC le 24-11-2002 à 18:14:28

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 24-11-2002 à 18:24:55    

Taz@PPC a écrit a écrit :

t'es sympa mais on n'a dit qu'on faisait pas les devoirs des autres.




 
j'y ai pas tout fait, il reste encore le truc avec les fichiers  :sarcastic:  
mon code n'est pas propre (c'est un vieux code qui trainait) mais tu vas surement le nettoyer si tu as le temps.
 
n'empeche que je v tenir compte de tes remarques  :jap:


---------------
yo, nippon ichi
Reply

Marsh Posté le 24-11-2002 à 18:37:23    

le but c'est d'abord l'algo, ensuite l'implémentation
 
ton code c'est du pur C imbitable et a l'algo que je devine, j'aurais pas fait comme ca :D
 
 
taratata54 > quel est ton niveau de connaissance sur les pointeurs et les fonctions de la biblitoheque standard, ton niveau d'etudes?
 
edit: tres beau le sizeof(char)  :p


Message édité par Taz@PPC le 24-11-2002 à 18:37:55

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 24-11-2002 à 18:42:57    

taz@ppc > ca m'intéresse de savoir comment tu aurais fait
le sizeof(char) c'est pour être plus explicite que 1 pour ceux qui ne le savent pas


---------------
yo, nippon ichi
Reply

Marsh Posté le 24-11-2002 à 18:42:57   

Reply

Marsh Posté le 24-11-2002 à 19:02:35    

Merci quand même d'avoir répondu à ma demande d'aide, même si on fait pas les devoirs des autres !...
Bien qu'étudiant bac+5, mon niveau en informatique est quasiment nul, le prof nous a simplement dit de s'autoformer avec les bouquins et les exo en classe. Alors pour l'instant, je découvre.
J'ai vu les tableaux, je commence les fichiers, mais j'y vais doucement.
Merci à vous tous pour votre aide !
CIAO

Reply

Marsh Posté le 26-11-2002 à 13:21:44    

up

Reply

Marsh Posté le 26-11-2002 à 13:43:32    

si tu ve de l'aide, ben v'la un conseil, tente d'abord le vb, c 15 fois plus simple pour comprendre la structure d'un programme, y a pa a ce faire chier avec les pointeurs et compagnie, et ca aura le merite de t'apprendre pensée tes programmes, et plus ca s'apprend vite =) (jai mis 2 jours). Enfin c n'est que mon humble avis....

Reply

Marsh Posté le 26-11-2002 à 13:44:10    

et meme si tu ve pe t'expliquer comment reglé ton probleme en vb =)

Reply

Marsh Posté le 26-11-2002 à 13:55:39    

was here [:yaisse2]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 26-11-2002 à 13:58:19    

MrX a écrit a écrit :

une horreur




[:vomi]

Reply

Marsh Posté le 26-11-2002 à 14:03:43    

a bon ?? ou ca ?

Reply

Sujets relatifs:

Leave a Replay

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