Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3268 connectés 

  FORUM HardWare.fr
  Programmation
  C

  compter chaine1 dans chaine2

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

compter chaine1 dans chaine2

n°1348080
big_dadi_f​at
Posté le 17-04-2006 à 13:37:13  profilanswer
 

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  :)

mood
Publicité
Posté le 17-04-2006 à 13:37:13  profilanswer
 

n°1348081
skelter
Posté le 17-04-2006 à 13:41:19  profilanswer
 

non, mais tu peux boucler avec strstr

n°1348082
big_dadi_f​at
Posté le 17-04-2006 à 13:45:53  profilanswer
 

skelter a écrit :

non, mais tu peux boucler avec strstr


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

skelter a écrit :

non, mais tu peux boucler avec strstr


 :??:  
 
 
 :)

n°1348086
skelter
Posté le 17-04-2006 à 13:54:10  profilanswer
 
n°1348094
big_dadi_f​at
Posté le 17-04-2006 à 14:04:08  profilanswer
 

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  :)

n°1348103
big_dadi_f​at
Posté le 17-04-2006 à 14:14:13  profilanswer
 

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  :)

n°1348104
skelter
Posté le 17-04-2006 à 14:14:53  profilanswer
 

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
n°1348108
big_dadi_f​at
Posté le 17-04-2006 à 14:22:42  profilanswer
 

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).

n°1348115
darkoli
Le Petit Dinosaure Bleu
Posté le 17-04-2006 à 14:28:21  profilanswer
 

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
n°1348126
big_dadi_f​at
Posté le 17-04-2006 à 14:43:58  profilanswer
 

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

mood
Publicité
Posté le 17-04-2006 à 14:43:58  profilanswer
 

n°1348127
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-04-2006 à 14:45:03  profilanswer
 

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/
n°1348132
big_dadi_f​at
Posté le 17-04-2006 à 14:53:04  profilanswer
 

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:

n°1348141
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-04-2006 à 15:01:22  profilanswer
 

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/
n°1348145
big_dadi_f​at
Posté le 17-04-2006 à 15:03:59  profilanswer
 

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:

n°1349796
big_dadi_f​at
Posté le 19-04-2006 à 15:57:55  profilanswer
 

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 .

n°1349801
_darkalt3_
Proctopathe
Posté le 19-04-2006 à 16:01:05  profilanswer
 

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.

n°1349821
big_dadi_f​at
Posté le 19-04-2006 à 16:13:58  profilanswer
 

_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 !! :(

n°1349832
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-04-2006 à 16:20:11  profilanswer
 

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/
n°1349866
big_dadi_f​at
Posté le 19-04-2006 à 16:52:00  profilanswer
 

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 ?

n°1349876
franceso
Posté le 19-04-2006 à 17:01:08  profilanswer
 

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
n°1349881
Emmanuel D​elahaye
C is a sharp tool
Posté le 19-04-2006 à 17:03:21  profilanswer
 

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/
n°1349908
big_dadi_f​at
Posté le 19-04-2006 à 17:18:14  profilanswer
 

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

n°1350340
big_dadi_f​at
Posté le 20-04-2006 à 11:54:30  profilanswer
 

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:    ...

n°1350430
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-04-2006 à 13:33:41  profilanswer
 

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/
n°1351859
big_dadi_f​at
Posté le 22-04-2006 à 15:55:47  profilanswer
 

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. }


 

n°1351864
big_dadi_f​at
Posté le 22-04-2006 à 16:08:53  profilanswer
 

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  :)  
 

n°1351865
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-04-2006 à 16:10:09  profilanswer
 


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/
n°1351868
big_dadi_f​at
Posté le 22-04-2006 à 16:19:41  profilanswer
 

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 )  ?
 
 
 
 
?

n°1351893
franceso
Posté le 22-04-2006 à 17:20:27  profilanswer
 

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
n°1351894
big_dadi_f​at
Posté le 22-04-2006 à 17:25:09  profilanswer
 

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.
 
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  compter chaine1 dans chaine2

 

Sujets relatifs
VB compter le nombre de valeurCompter le nombre de caractère d'une ligne d'un fichier
[C] Compter le nombre de lignes d'un fichierCompter le nombre de fois qu'une expression revient
Compter des getElementByIdCompter un nombre de jours en timestamp
compter le nombre de fichier dans une table[Excel] Compter le nombre de cellule non vide d'une colonne
[RESOLU]Compter le nombre de ligne d'un fichierCompter le nombre de mots doublons
Plus de sujets relatifs à : compter chaine1 dans chaine2


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR