Fonction érronée qui retourne n'importe quoi

Fermé
djemaoune Messages postés 21 Date d'inscription jeudi 13 décembre 2007 Statut Membre Dernière intervention 31 mai 2011 - 10 janv. 2010 à 21:19
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 11 janv. 2010 à 22:30
Bonjour,

j'ai une petite fonction que g réalisé avec C normalement elle doit retournée la position du début d'une sous chaine de taille "m" dans une chaine de caractère de taille "n" n>m

exemple
la chaine : aaaababbbb (n)
ss chaine: abab (m)

la fonction doit donc retourné la position ou débute la sous chaine donc ici c "4"

mon problème que que la mienne retourne un numéro beaucoup plus grand que la chaine toujours retourne 2293700 j'ai essayé de retourné lz contenue d'une autre variable dans la fonction mais c toujours le même numéro qui se répète a chaque foi

voici ma petite fonction :
je donne tout le programme en c jamais y a une faute ailleurs

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef char tab[100];

int recherchemot(int pos,tab texte,int n,tab motif,int m)
{
int j,p,b=1;
while(pos<=n-m)
{
p=pos; j=0;
while((j<=m)&&(b==1))
{if (texte[pos]==motif[j]){pos++;j++;}
else b=0;
}
if(j>m) return(p);
else {
pos=p;
pos++;
}
}
if(pos>n-m+1) return (-1);
}


tab texte,motif;
int n,m,i;
int main()
{ printf("donner la chaine :");
scanf("%s",&texte);
printf("donner la chaine :");
scanf("%s",&motif);
n=strlen(texte);
m=strlen(motif);

printf("N = %d et M = %d",n,m);

i= recherchemot(0,texte,n,motif, m);

printf("le motif est a la position :%d",i);

scanf("%d",i);
getchar();
return 0;
}


merci de m'aider et expliquée se qui arrive car elle me paré correcte
A voir également:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
10 janv. 2010 à 22:41
Salut,
Ta fonction rechercheMot() ne renvoie pas de valeur dans tous les cas.
Pour t'en convaincre, mets un return -2; tout à la fin. Et tu verras bien si c'est le -2 qui est renvoyé ou pas.
Ceci explique pourquoi lorsque tu affiches la valeur retournée par cette fonction, t'obtiens un nombre erroné.
Je t'invite donc à revoir l'algorithme de la fonction.
Par ailleurs, il vaut mieux éviter d'utiliser les variables globales.
Il ne faut pas mettre d'esperluette lorsque tu mets scanf d'une chaîne de caractère. Ce n'est pas : scanf("%s",&texte); mais scanf("%s",texte); tout simplement.

scanf("%d",i);
scanf inutile et en plus il faut mettre l'adresse de la variable.

Sinon, le but de ce code c'est de reproduire la fonction standard strstr() à titre d'entraînement ?

Cdlt,
0
djemaoune Messages postés 21 Date d'inscription jeudi 13 décembre 2007 Statut Membre Dernière intervention 31 mai 2011 5
10 janv. 2010 à 23:44
salut,

OK merci bien pour votre aide mais moi je comprend pas ou est le problème pour quoi il retourne n'importe quoi c pas logique tout est bon mais a part les scanf("%s",&texte); que g réglé j'ai rien trouvé d'autre même j'ai essayé de changé le nombre d'itération , j'ai essayé de supprimer le dernier retourne mai toujours il retourne la même valeur je me suis dit peut être y a un problème sur mon compilateur c ou ma machine j'utilise vista c la premier foi que je l'utilise sous vista je c pas je suis pas sur !!

je suis débutant en C ;

@++ ^^
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
11 janv. 2010 à 02:37
non, il y a des problèmes dans ton code. Le C est assez délicat au niveau des pointeurs, des variables ,etc... . En général, les bugs causés par une mauvaise utilisation des pointeurs oudes variables donnent des résultats inattendus et qui dépendent de la machine. de même, si tu ne retournes rien à la fin d'une fonction, on est dans ce cas là : tu peux avoir aussi des résultats inattendus, comme toujours un nombre bizarre qui n'a apparemment aucun lien avec ton programme.

Corrige déjà ce que t'a suggéré Fiddy (y compris l'histoire du return, poste ton code de nouveau et dis-nous si ça va mieux ou ce qui cloche à ce moment et comment il réagit. Peut-être le problème n'est pas là en fait, mais avec le return -2 ça éliminera déjà une possibilité.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 janv. 2010 à 06:25
mais moi je comprend pas ou est le problème pour quoi il retourne n'importe quoi c pas logique
Je te l'ai expliqué plus haut. La fonction ne passe pas forcément par ton return. D'ailleurs, je pense que ton compilateur devrait le signaler en utilisant le warning. Ainsi si aucune valeur n'est retournée, le programme retournera la valeur de l'accumulateur qui est une valeur bidon à ce moment.
Et pour t'en convaincre, teste avec le return -2 comme je t'ai dit.

Cdlt,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
djemaoune Messages postés 21 Date d'inscription jeudi 13 décembre 2007 Statut Membre Dernière intervention 31 mai 2011 5
11 janv. 2010 à 21:47
enfét j'ai essayé avec la solution de fiddy mais rien n'a changé c toujours le même problème g essayé d'afficher des MSGs dans les 2eme boucle imbriqué mais le résultat ma complètement beugué

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef char tab[100];

int recherchemot(int pos,tab texte,int n,tab motif,int m)
{
int j,p,b=1;
while(pos<=n)
{
printf("bonjour\n");
p=pos; j=1;
while((j<=m)and(b==1))

{
printf("bonjour\n");
if (texte[pos]==motif[j]){pos++;j++;}
else b=0;
}
if(j>m) return(p);
else {
pos=p;
pos++;
}
}
return (-1);
}

tab texte,motif;
int main()
{ int n,m,i;
printf("donner la chaine :");
scanf("%s",texte);
printf("donner la chaine :");
scanf("%s",motif);
n=strlen(texte);
m=strlen(motif);

printf("N = %d et M = %d",n,m);

i= recherchemot(1,texte,n,motif, m);

printf("le motif est a la position :%d",i);
getchar();getchar();
}

le problème la programme rentre uniquement une foi dans le 2eme while j'ai pas compris pour quoi !!!!!!!!! donc maintenant il retourne toujours -1 car il rentre termine jamais le travaille demandé dans le 2eme tant que



voici mon teste :

donner la chaine :aaaababbbb
donner la chaine :abab
N = 10 et M = 4
bonjour bonsoir
bonjour
bonjour
bonjour
bonjour
bonjour
bonjour
bonjour
bonjour
bonjour
le motif est a la position :-1
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 janv. 2010 à 22:30
Salut,

Enfét j'ai essayé avec la solution de fiddy
Euh, je t'ai donné aucune solution...

Je t'ai juste dit d'où venait ton problème.
Essaie de tester à la main ton algorithme, et tu verras l'erreur dans ton algorithme.
0