Où est le problème ?
assyass.mahmoud
Messages postés
19
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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 :-).