Erreur de segmentation fonction reccursive

Résolu
rocksider Messages postés 106 Date d'inscription   Statut Membre Dernière intervention   -  
rocksider Messages postés 106 Date d'inscription   Statut Membre Dernière intervention   -
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:è

2 réponses

kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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   Statut Membre Dernière intervention   9
 
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