Erreur de segmentation fonction reccursive

Résolu/Fermé
rocksider Messages postés 106 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 16 mars 2012 - 9 janv. 2009 à 14:54
rocksider Messages postés 106 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 16 mars 2012 - 9 janv. 2009 à 15:16
Bonjour,
J'ai programmé une fonction réccursive qui doit comparer le nombre d'occurence de deux lettres et retourné celui qui est present le plus, mais apres compilation et execution le code me retourne Erreur de segmentation, or je vois pas d'ou provenir ce probleme , voilà le code:

#include<stdio.h>

int nbrle(char mot[],char lettre1,char lettre2,int i,int nl1,int nl2)
{
if(mot[i]!='\0')
	if(mot[i]==lettre1)
		return nbrle(mot,lettre1,lettre2,i++,nl1++,nl2);
	else if(mot[i]==lettre2)
		return nbrle(mot,lettre1,lettre2,i++,nl1,nl2++);
	     else
		return nbrle(mot,lettre1,lettre2,i++,nl1,nl2);	
else
	if(nl1>nl2)
		return 1;
	else
		return 0;
}


int main(void)
{
char c,lettre1,lettre2,chaine[20];
int resultat=0;
printf("Donner la 1er lettre: ");
scanf("%c",&lettre1);
while((c=fgetc(stdin))!='\n');
printf("Donner la 2éme lettre: ");
scanf("%c",&lettre2);
while((c=fgetc(stdin))!='\n');
printf("Donner la chaine de caractere: ");
gets(chaine);
puts(chaine);
resultat=nbrle(chaine,lettre1,lettre2,0,0,0);

if(resultat)
	printf("Le nombre de %c est supérieur a celui de %c dans %s",lettre1,lettre2,chaine);
else
	printf("Le nombre de %c est supérieur a celui de %c dans %s",lettre2,lettre1,chaine);
return 0;
}

Help:è
A voir également:

2 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
9 janv. 2009 à 15:05
Salut,

A mon avis tu dépasses ta pile aà d'une récursivisité infinie.
A mon avis c'est parce que tu utilises la post-incrémentation à la place de la pré-incrémentation.
Exemple:
return nbrle(mot,lettre1,lettre2,i++,nl1++,nl2);

Quand tu fais ça c'est l'équivalent de:
tmp = nbrle(mot,lettre1,lettre2,i,nl1,nl2);
i = i + 1;
nl1 = nl1 + 1;
return tmp;

En réalité ici tu as besoin de la pré-incrémentation:
return nbrle(mot,lettre1,lettre2,++i,++nl1,nl2);

=
i = i + 1;
nl1 = nl1 + 1;
return nbrle(mot,lettre1,lettre2,i,nl1,nl2);

Tu vois? Comme tu n'incrémentes pas tes nombres finalement, tu fais un appel récursif infini sur le même i et
la pile d'appels de fonctions finit par saturer.

Et il faudra faire ces pré-incrémentations sur tes 3 return.
0
rocksider Messages postés 106 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 16 mars 2012 9
9 janv. 2009 à 15:16
Oui ça a resolu le probleme, merci bcp kilian, j'avais fait la 1er fois pré-incrementation, mais a la fin ché pas pourquoi je l'avait changer ^^
0