Où est le problème ?
assyass.mahmoud
Messages postés
23
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
j'ai fait une petit exercice en langage C, voilà l'énoncé:
écrivez un programme qui vérifie si une sous-chaine existe dans une chaîne.
voilà le Code Source de ma version :
écrivez un programme qui vérifie si une sous-chaine existe dans une chaîne.
voilà le Code Source de ma version :
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
int i,j,k,verif;
char ch[300],sch[30];
printf("entrez votre texte\t");
gets(ch);
printf("entrez le mot que vous cherchez\t");
gets(sch);
for(i=0,k=0,verif=0;i<strlen(ch);i++){
for(j=i;j<(strlen(sch)+i);j++){
verif+=fabs(strcmp(sch[k],ch[j]));
k++;
}
printf("la valeur de %d",verif);
if(verif==0){printf("\nexiste");break;}
}
if(verif!=0)
printf("le mot que vous avez entrez n'éxiste pas");
return 0;
}
2 réponses
Salut,
J'ai regardé ton programme,
remarque:
1/ strcmp compare une chaine avec une autre et envoie 0 si elle sont identique et autre choses sinon, et c'est pas ce que tu veux !!!
2/ t'as pas besoin de déclarer k , utilise juste i et j ^^
pour faire ce programme ,
dans les deux boucles for fait un test if et chaque fois que un élement de la sous chaine soit égale à l'élement de la chaine augment un compteur , (verif ) dans ton cas, et compare le à la fin avec strlen(sch) si il est égale c'est que c'est bon sinon c'est pas bon :)
J'ai regardé ton programme,
remarque:
1/ strcmp compare une chaine avec une autre et envoie 0 si elle sont identique et autre choses sinon, et c'est pas ce que tu veux !!!
2/ t'as pas besoin de déclarer k , utilise juste i et j ^^
pour faire ce programme ,
dans les deux boucles for fait un test if et chaque fois que un élement de la sous chaine soit égale à l'élement de la chaine augment un compteur , (verif ) dans ton cas, et compare le à la fin avec strlen(sch) si il est égale c'est que c'est bon sinon c'est pas bon :)
Plusieurs problèmes :
gets(ch);
gets(sch);
A ne pas utiliser. Il faut plutôt utiliser fgets(). De plus, ces fonctions stockent lorsqu'il y a suffisamment de place un '\n' en fin de chaîne. Donc attention à le supprimer sinon, cela faussera tes recherches d'inclusion de sous-chaînes.
Question de style :
for(i=0,k=0,verif=0;i<strlen(ch);i++){
Initialise verif=0 e k=0 avant le for plutôt.
verif+=fabs(strcmp(sch[k],ch[j]));
C'est lourd... Utilise plutôt un if. Ou de manière concise :
De plus attention, strcmp() sert à comparer des chaînes pas des caractères. Sémantiquement, il faudrait plutôt mettre sch+k et ch+j. Mais je ne vois ps ce que tu veux faire avec ça ? Plutôt strncmp(), et tu précises le nombre de caractères à remplacer.
printf("la valeur de %d",verif);
N'oublie pas un '\n' en fin de chaîne.
printf("le mot que vous avez entrez n'éxiste pas");
Même remarque.
Je te laisse déjà corriger tout ça. Reposte ton programme corrigé et on corrigera les résidus :-).
gets(ch);
gets(sch);
A ne pas utiliser. Il faut plutôt utiliser fgets(). De plus, ces fonctions stockent lorsqu'il y a suffisamment de place un '\n' en fin de chaîne. Donc attention à le supprimer sinon, cela faussera tes recherches d'inclusion de sous-chaînes.
Question de style :
for(i=0,k=0,verif=0;i<strlen(ch);i++){
Initialise verif=0 e k=0 avant le for plutôt.
verif+=fabs(strcmp(sch[k],ch[j]));
C'est lourd... Utilise plutôt un if. Ou de manière concise :
verif+=strcmp(...,...)==0?0:1;
De plus attention, strcmp() sert à comparer des chaînes pas des caractères. Sémantiquement, il faudrait plutôt mettre sch+k et ch+j. Mais je ne vois ps ce que tu veux faire avec ça ? Plutôt strncmp(), et tu précises le nombre de caractères à remplacer.
printf("la valeur de %d",verif);
N'oublie pas un '\n' en fin de chaîne.
printf("le mot que vous avez entrez n'éxiste pas");
Même remarque.
Je te laisse déjà corriger tout ça. Reposte ton programme corrigé et on corrigera les résidus :-).