char chaine[40], souschaine[40];faire un programme qui saisit ces deux chaines, et (à l'aide de sous-programmes) dise où et combien de fois on trouve la souschaine dans la chaine.
Exemple : chaine="FONCTION", souschaine="ON", on trouve deux fois la souschaine, en position 1 et 6.
nb=0; for(i=0;chaine[i];i++) { for(j=0;souchaine[j]&&chaine[i+j];j++) if(souschaine[j]!=chaine[i+j])break; if(!souschaine[j]) printf("%dième position : %d\n",++nb,i); }
typedef char string[40];Dans ce cas la déclaration de la question précédente devient :
str chaine, souschaine;Créez un tableau de 20 str maximum (le nombre réel sera stocké dans la variable nblig), effectuez la saisie et cherchez la souschaine dans tout le texte, en indiquant, si vous l'avez trouvée, le numéro de ligne et la position dans la ligne.
Solution : le plus simple est de créer une fonction comparant deux chaines (on vient de le faire) et de l'appeler nblig fois :
#include <stdio.h> typedef char str[40]; int compare(str chaine, str souschaine, int l) { int i,j,nb=0; for(i=0;chaine[i];i++) { for(j=0;souchaine[j]&&chaine[i+j];j++) if(souschaine[j]!=chaine[i+j])break; if(!souschaine[j]) printf("ligne %d, %dième position : %d\n",l,++nb,i); } return(nb); } void main(void) { str sch,texte[20]; int nblig,l,nb=0; printf("combien de lignes ? "); scanf("%d",&nblig); fflush(stdin); /*en turbo C la gestion du clavier par scanf est incompatible avec gets sans ca*/ for(l=0;l<nblig;l++) { printf("ligne %d ?",l); gets(texte[l]); } printf("sous chaine à chercher ? ?"); gets(sch); for(l=0;l<nblig;l++) nb+=compare(texte[l],sch,l); printf("en tout on en a trouvé %d \n",nb); }
Patrick TRAU,ULP - IPST 12/12/97