Où est le problème ?

Fermé
assyass.mahmoud Messages postés 19 Date d'inscription vendredi 10 janvier 2014 Statut Membre Dernière intervention 15 mars 2017 - Modifié par assyass.mahmoud le 19/06/2014 à 14:56
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 25 juin 2014 à 22:52
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 :
#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

master_29 Messages postés 49 Date d'inscription dimanche 8 décembre 2013 Statut Membre Dernière intervention 28 août 2017 12
25 juin 2014 à 17:14
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 :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 juin 2014 à 22:52
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 :
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 :-).
0