compter chaine1 dans chaine2

compter chaine1 dans chaine2 - C - Programmation

Marsh Posté le 17-04-2006 à 13:37:13    

salut  :hello:  
je ve simplement savoire si en C , il y a une fonction (ou...?) qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1 ;
exemple:
si on a:
ch1:   "ce forum est trop top"
ch2:   "op"
la fonction doit retourner la valeur 2
 
merci  :)

Reply

Marsh Posté le 17-04-2006 à 13:37:13   

Reply

Marsh Posté le 17-04-2006 à 13:41:19    

non, mais tu peux boucler avec strstr

Reply

Marsh Posté le 17-04-2006 à 13:45:53    

skelter a écrit :

non, mais tu peux boucler avec strstr


 
 :??:  :??:  :??:  
c'est quoi ca

skelter a écrit :

non, mais tu peux boucler avec strstr


 :??:  
 
 
 :)

Reply

Marsh Posté le 17-04-2006 à 13:54:10    

Reply

Marsh Posté le 17-04-2006 à 14:04:08    

merci mec .
 
mais esqu'on peut construire cette fonction   ""(qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1 )""   par nous meme ?
 :p  :)

Reply

Marsh Posté le 17-04-2006 à 14:14:13    

je ve construire en c la fonction :    strcomptstr( const char *ch1 , const char *ch2 );
qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1.
pourai ' je  avoire un peut d'aide SVP.
merci  :)

Reply

Marsh Posté le 17-04-2006 à 14:14:53    

big_dadi_fat a écrit :

merci mec .
 
mais esqu'on peut construire cette fonction   ""(qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1 )""   par nous meme ?
 :p  :)


 
 
oui, en te servant de strstr

Message cité 1 fois
Message édité par skelter le 17-04-2006 à 14:15:30
Reply

Marsh Posté le 17-04-2006 à 14:22:42    

skelter a écrit :

oui, en te servant de strstr


 
mais strstr c'est une fonction predefinie qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1 .    mois je ve la construire (strstr).

Reply

Marsh Posté le 17-04-2006 à 14:28:21    

big_dadi_fat a écrit :

mais strstr c'est une fonction predefinie qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1 .    mois je ve la construire (strstr).

Extrait de man strstr ...

SYNOPSIS
       #include <string.h>
 
       char *strstr (const char *meule_de_foin, const char *aiguille);
 
DESCRIPTION
       La  fonction  strstr()  cherche la premiere occurence de la sous-chaîne aiguille au sein de la chaîne meule_de_foin. Les caractères ‘\0’ de fin ne sont pas comparés.


Donc tu peux utiliser la fonction strstr() pour compter le nombre d'apparitions d'une chaîne dans une autre mais pas directement. Il faut voir cette fonction comme un outil que tu vas devoir utiliser plusieurs fois (N+1 pour être précis :D).


Message édité par darkoli le 17-04-2006 à 14:29:07

---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 17-04-2006 à 14:43:58    

ahhh OUI.
 
merci pour ton aide .    :)  :)  :)  je vais essayer.
 
et si j'ai des dificulter , vous m'aidiez ?  
 
merci et a+    :jap:  :jap:  :jap:

Reply

Marsh Posté le 17-04-2006 à 14:43:58   

Reply

Marsh Posté le 17-04-2006 à 14:45:03    

big_dadi_fat a écrit :

mais strstr c'est une fonction predefinie qui compte combien de fois une chaine ch2 apparais dans une autre chaine ch1 .    mois je ve la construire (strstr).


Non. Tu as lu la doc ? Elle retourne l'adresse de la première occurence ou NULL si elle est absente.
Elle ne compte rien du tout. Si tu veux compter, à toi de boucler comme il faut...
 
Maintenant, si tu veux construire strstr(), c'est autre chose.
 
Essaye de clarifier ta demande, parce que là, c'est pas clair.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 17-04-2006 à 14:45:51

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-04-2006 à 14:53:04    

Emmanuel Delahaye a écrit :

Non. Tu as lu la doc ? Elle retourne l'adresse de la première occurence ou NULL si elle est absente.
Elle ne compte rien du tout. Si tu veux compter, à toi de boucler comme il faut...
 
Maintenant, si tu veux construire strstr(), c'est autre chose.
Essaye de clarifier ta demande, parce que là, c'est pas clair.


 
non non : c'est moois qui n'a pas comprit au début , mnt c'est bon , je ve construire ma fonction (qui compt combien de fois ch2 et repeter dans ch1) à l'aide de strstr .  :)  merci.
 
encore une petit question : esqu'il faut absolument utiliser strstr pour construire ma fonction .
 
encor merci  :jap:

Reply

Marsh Posté le 17-04-2006 à 15:01:22    

big_dadi_fat a écrit :

encore une petit question : esqu'il faut absolument utiliser strstr pour construire ma fonction .


C'est la démarche logique dans l'industrie : on utilise ce qui existe avant de réinventer la roue. Maintenant, dans une démarche pédagogique, on peut certainement s'en passer et faire autrement.
 
Tout dépend du contexte.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-04-2006 à 15:03:59    

Emmanuel Delahaye a écrit :

C'est la démarche logique dans l'industrie : on utilise ce qui existe avant de réinventer la roue. Maintenant, dans une démarche pédagogique, on peut certainement s'en passer et faire autrement.
 
Tout dépend du contexte.


 
OK merci.
 
si j'ai encore des prob , je vous poserai des question , OK ?  :)  :lol:  :)  
 
A+ :hello:

Reply

Marsh Posté le 19-04-2006 à 15:57:55    

resalut:
 
j'ai resolu se problème , sans utiliser la fonction strstr .
voici le code :

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. /* le prototipe de la fonction */
  4. int cpt_rep( const char *a , const char *b );
  5. /* la fonction principale -main- */
  6. main(void)
  7. {     char ch1[100],ch2[100];
  8. puts("donnez la chaine printsipale:" );     gets(ch1);
  9. puts("donnez la chaine cible:" );        gets(ch2);
  10. printf("la chaine: \"%s\" apparait %d fois , dans la chaine: \"%s\"",ch2 , cpt_rep(ch1,ch2) , ch1 );
  11. }
  12. /* construction de la fonction (en recherche le nbr de fois que b apparaît dans a)*/
  13. int cpt_rep( const char *a , const char *b )
  14. {     char tmp[100];     int n,i,j,h=0,rep=0;
  15. n=strlen(b);
  16. for(i=n-1;i<strlen(a);i++)
  17. {
  18.   for(j=i-(n-1);j<=i;j++) { tmp[h]=a[j]; h++; }     tmp[h]='\0';
  19.   if(strcmp(b,tmp)==0) rep++;
  20.   h=0;
  21. }
  22. return rep;
  23. }


 
mais mnt je cherche une autre version , en utilisant strstr , mais je n'arrive pas à commencer (je ne sais pas comment et oû l'utiliser) :
alors un coup de pouce sera la bien venu ,  :)  ,  merci .

Reply

Marsh Posté le 19-04-2006 à 16:01:05    

http://www.cplusplus.com/ref/cstring/strstr.html
 
Comment : en comptant le nombre de fois ou tu utilises strstr (donc ton nombre d'occurences)
 
Sinon avec strtok aussi ca peut marcher.

Reply

Marsh Posté le 19-04-2006 à 16:13:58    

_darkalt3_ a écrit :


Comment : en comptant le nombre de fois ou tu utilises strstr (donc ton nombre d'occurences)


mais strstr me mentre selement si cette sous chaine[u] apparait dans la grande chaine elle ne me donne pas la position de cette occurence pour que je puisse continuer la rechaire d'ocurence dans la grande chaine.[i] !
je ne vois pas donc comment on peut compter le nombre de fois ou strstr à été utiliser !! :(

Reply

Marsh Posté le 19-04-2006 à 16:20:11    

big_dadi_fat a écrit :

mais strstr me mentre selement si cette sous chaine[u] apparait dans la grande chaine elle ne me donne pas la position de cette occurence pour que je puisse continuer la rechaire d'ocurence dans la grande chaine.[i] !


Et la valeur retournée, c'est pour la déco ?
 
Si tu ne comprends pas les paramètres, pose des questions. Tu ne peux pas raisonner sainement sur des connaissances floues ou insuffisantes...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-04-2006 à 16:52:00    

Emmanuel Delahaye a écrit :

Et la valeur retournée, c'est pour la déco ?
 
Si tu ne comprends pas les paramètres, pose des questions. Tu ne peux pas raisonner sainement sur des connaissances floues ou insuffisantes...


 
bon , recapitulent  
selon ce code :

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. main() {    char ch[30];     int h;
  4. gets(ch);
  5. printf(" %d",strstr(ch,"lol" ));
  6. printf("\n %s",strstr(ch,"lol" ));
  7. }


 
---> si la chaine qui à été saisie contien un ou plusieur "lol" alors:
j'ai comme resulta un nombre (n'importe quoi : 8660)  :??:  
et la chaine qui à été saisi .
--->si la chaine ne contien pas "lol" alors
j'ai un 0
et un "(null)" .
 
alors

Citation :

Et la valeur retournée, c'est pour la déco


 :??:  :??:  :??:  
 
comment je peut l'utiliser donc ?

Reply

Marsh Posté le 19-04-2006 à 17:01:08    

strstr renvoie un pointeur vers la première occurence de la sous-chaine cherchée (aiguille) dans la grosse chaîne (botte de foin). strstr renvoie NULL si aiguillle n'est pas présente dans botte de foin
 
donc :

Citation :


---> si la chaine qui à été saisie contien un ou plusieur "lol" alors:
j'ai comme resulta un nombre (n'importe quoi : 8660) c'est pas n'importe quoi : c'est l'adresse de la première occurence de "lol" dans ch
et la chaine qui à été saisie pas la chaine qui a été saisie : la fin de la chaine à partir de la première occurrence de "lol"
--->si la chaine ne contien pas "lol" alors
j'ai un 0 et un "(null)" . normal : "lol" n'était pas présent dans ch donc strstr renvoie NULL


Message édité par franceso le 19-04-2006 à 17:01:50

---------------
TriScale innov
Reply

Marsh Posté le 19-04-2006 à 17:03:21    

big_dadi_fat a écrit :

Citation :

Et la valeur retournée, c'est pour la déco


 :??:  :??:  :??:  
 
comment je peut l'utiliser donc ?


 
La doc que tu refuses de lire  
 
http://dpobel.free.fr/man/html/aff [...] an/strstr/
 
dit en substance :

Citation :

C'est l'adresse du premier caractère de la chaine trouvée ou NULL si il ne l'a pas trouvée.

(C'est exactement ce que t'a montré ta petite expérience, non ?)

Code :
  1. char s[] = "aa lol bbb lolo";
  2.    char *p = strstr (s, "lol" );
  3.    if (p != NULL)
  4.    {
  5.       printf ("trouve : '%s'\n", p);
  6.       /* maintenant, se creuser un peu la tete pour chercher l'occurence suivante */
  7.    }
  8.    else
  9.    {
  10.       printf("chaine inconnue\n" );
  11.    }


Une fois que tu as compris la méthode, tu généralises avec une boucle, un compteur et un peu de cervelle. Eh oui, il faut reflechir un peu... Fait un petit dessin si ça t'aide...
 

#include <stdio.h>
#include <string.h>
int main(void) {char const meule[]  
= "aa lol bbb lolo";char const aigu\
ille[] = "lol";char const*p=meule;
int count=0;while((p=strstr(p,aigui\
lle))!=NULL){p += strlen(aiguille);c\
ount++;}if(count!=0){printf("trouve "
"%d occurences de '%s' dans '%s'\n",  
count,aiguille,meule);}else{printf(
"chaine inconnue\n" );}return 0;}


Message édité par Emmanuel Delahaye le 19-04-2006 à 17:24:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 19-04-2006 à 17:18:14    

OK ,  je vais essayer .
 
 :love:  
 
merci pour tout  
 

Reply

Marsh Posté le 20-04-2006 à 11:54:30    

ouf..   enfin,
je crois que j'ai compris la tecnique:
--------------------------------------------------------------------------
si notre grande chaine ch est : "AAAhihBBBhihCCC" ;    alors
 
en faisons :  

Code :
  1. char *p = strstr(ch,"hih" );


p pointera sur la chaine "hihBBBhihCCC"
 
en faisons:  

Code :
  1. p=p+3;      /* 3 == strlen("hih" ) */


p pointeura sur "BBBhihCCC"               ---> la 1er occurence
 
en reutilisant strstr comme suit:  

Code :
  1. p = strstr(p,"hih" )


p pointera sur : "hihCCC"
 
en faisons :

Code :
  1. p=p+3;


p pointera sur "CCC"                          --->la 2eme ocurence
 
enfin :    

Code :
  1. p=strstr(p,"hih" );       /*nous donne un resultat null*/


p pointra sur NULL    ==>  c'est fini.
-------------------------------------------------------------
 
[i]alors ?  c'est ca ou non ? .[u]
 
--> je vais essayer de generaliser avec un while:    ...

Reply

Marsh Posté le 20-04-2006 à 13:33:41    

big_dadi_fat a écrit :

ouf..   enfin,
je crois que j'ai compris la tecnique:
[i]alors ?  c'est ca ou non ? .[u]


Oui.

Citation :

--> je vais essayer de generaliser avec un while:    ...


Bien.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-04-2006 à 15:55:47    

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. main(void) {   char *p,ch1[100],ch2[100];   int n,i=0;
  4. gets(ch1);   gets(ch2);
  5. n = strlen(ch2); 
  6. p = strstr(ch1,ch2);
  7. while (p != NULL)
  8. {
  9. p += n;   i++;
  10. p = strstr(p,ch2);
  11. }
  12. printf("le nombre d'occurence est : %d",i);
  13. }


 

Reply

Marsh Posté le 22-04-2006 à 16:08:53    

C'est ok pour strstr ,    
mais en le comparant avec le 1er code (sans utilisation de strstr -voire si dessou-) , je vois un prtit cas particulier non traiter dans la vertion qui utilise strstr .
par exemple :  si la grande chaine est "ototoAtoKotoJ" , et la soous chaine est "oto"
la version du strstr :    me donne  2 occurance    --> elle ne recompt pas le o utiliser 2 fois
mais la version si dessou (sans strstr) me donne 3  --> en effait elle compte toutte les ocurence sans exeption .
 
le code:

Code :
  1. #include<stdio.h>
  2. #include<string.h>
  3. /*le prototipe de la fonction*/
  4. int StrCompteStr( const char *chaine , const char *cible );
  5. /*la fonction principale main*/
  6. main(void)
  7. {     char ch1[100],ch2[100];      int hack;
  8. puts("donnez la chaine printsipale:" );     gets(ch1);
  9. puts("donnez la chaine cible:" );        gets(ch2);
  10. hack=StrCompteStr(ch1,ch2);
  11.  
  12. if ( hack )
  13.    printf( "la chaine: \" %s \" apparait %d fois, dans la chaine: \" %s \"",ch2,hack,ch1 );
  14. else   printf( "la chaine: \" %s \" est introuvable dans la chaine: \" %s \"",ch2,ch1 );
  15. }
  16. /*construction de la fonction*/
  17. int StrCompteStr(const char *chaine , const char *cible)
  18. {     char tmp[100];     int n,i,j,h=0,fois=0;
  19. n=strlen(cible);
  20. for(i=n-1;i<strlen(chaine);i++)
  21. {
  22.   for(j=i-(n-1);j<=i;j++) { tmp[h]=chaine[j]; h++; }     tmp[h]='\0';
  23.   if(strcmp(cible,tmp)==0) fois++;
  24.   h=0;
  25. }
  26. return fois;
  27. }


 
 
alors je praifaire cette mthd (sans strstr) .
et par l'ocasion je vous demande esque ce code peut encore être amelliorer ?
 
 
remerci  :)  
 

Reply

Marsh Posté le 22-04-2006 à 16:10:09    


Ton code commenté et corrigé.  

Code :
  1. //ine 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. /* -ed- ajoute pour nettoyer apes fgets()... */
  5. static void clean (char *s, FILE *fp)
  6. {
  7.    /* search ... */
  8.    char *p = strchr (s, '\n');
  9.    if (p != NULL)
  10.    {
  11.       /* ... and kill */
  12.       *p = 0;
  13.    }
  14.    else
  15.    {
  16.       /* purge */
  17.       int c;
  18.       while ((c = fgetc(fp)) != '\n' && c != EOF)
  19.       {
  20.       }
  21.    }
  22. }
  23. /* -ed-
  24. main(void)
  25. C99 exige que le type retourne soit explicite. */
  26. int main(void)
  27. {
  28.    char *p, ch1[100], ch2[100];
  29.    int n, i = 0;
  30.    /* -ed-
  31.    gets() est un bug qu'il ne faut pas utiliser
  32.    gets(ch1);
  33.    gets(ch2);
  34.    */
  35.    fgets(ch1, sizeof ch1, stdin);
  36.    clean(ch1, stdin);
  37.    fgets(ch2, sizeof ch2, stdin);
  38.    clean(ch2, stdin);
  39.    n = strlen(ch2);
  40.    p = strstr(ch1, ch2);
  41.    while (p != NULL)
  42.    {
  43.       p += n;
  44.       i++;
  45.       p = strstr(p, ch2);
  46.    }
  47. /* -ed-
  48.    printf("le nombre d'occurence est : %d", i);
  49. manque un '\n' */
  50.    printf("le nombre d'occurence est : %d\n", i);
  51.    /* -ed- C90 exige un retour de main() explicite. */
  52.    return 0;
  53. }


Message édité par Emmanuel Delahaye le 22-04-2006 à 16:10:41

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-04-2006 à 16:19:41    

euuh ,   ok , mais je n'est pas encore etudier les fichier en c  (je debutte en c) ,  et je ne comprend pas bien le code , mais merci pour tout .
 
et pour le code si desus (sans utiliser strstr )  ?
 
 
 
 
?

Reply

Marsh Posté le 22-04-2006 à 17:20:27    

pour compter toutes les occurrences de ta sous chaîne, tu pourrais reprendre la version utilisant strstr(), mais en faisant avancer le pointeur d'une case seulement au lieu de n lorsque tu trouves une occurrence.
 
ça donne quelque chose du genre :

Code :
  1. p = strstr(ch1, ch2);
  2. while (p != NULL)
  3.   {
  4.     p++; /* on continue à chercher à partir du caractère suivant */
  5.     i++;
  6.     p = strstr(p, ch2);
  7.   }
  8. printf("le nombre d'occurence est : %d\n", i);

Message cité 1 fois
Message édité par franceso le 22-04-2006 à 17:21:15

---------------
TriScale innov
Reply

Marsh Posté le 22-04-2006 à 17:25:09    

franceso a écrit :

pour compter toutes les occurrences de ta sous chaîne, tu pourrais reprendre la version utilisant strstr(), mais en faisant avancer le pointeur d'une case seulement au lieu de n lorsque tu trouves une occurrence.
 
ça donne quelque chose du genre :

Code :
  1. p = strstr(ch1, ch2);
  2. while (p != NULL)
  3.   {
  4.     p++; /* on continue à chercher à partir du caractère suivant */
  5.     i++;
  6.     p = strstr(p, ch2);
  7.   }
  8. printf("le nombre d'occurence est : %d\n", i);



 
 
 
 
 
c'est vrais je n'avais pas vu !  :D  
 
merci franceso.
 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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