Problème fonction (switch, buffer)

Signaler
-
Messages postés
13910
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 janvier 2021
-
Bonjour,

J'utilise dans ma fonction une fonction lire() dans un switch avec un scanf avant comme ceci :

BaseFaits creer_Bf()
{	
	int choix;
	BaseFaits b = nouvelle_Bf();
	char buffer[101];
	

	do
	{
		printf("(1) ajouter fait, (2) suite");

		scanf("%d",&choix);

		switch(choix) {

			case 1: printf("Fait à ajouter ?");
			lire(buffer);
			ajouter_Fait(b, buffer);
			break;
			
			case 2:
            printf("On passe à la suite\n"); 
			
		}

		printf("nouveau tour\n");
	}while(choix!=2);			
		
	printf("Sortie du while");
	return b;

}

Cela marche tant que je réponds 1 et ajoute un "fait", qui est un élément de ma liste chainée BaseFaits ayant pour valeur une chaîne de caractère.

Mais quand je sors du switch en entrant 2, mon marqueur "nouveau tour" apparaît mais pas "sortie du while" et le terminal m'affiche un segmentation fault.

Fonction lire :

int lire(char *Buffer)
{
	char *positionEntree = NULL;
	viderBuffer();
	/*On lit le texte saisi au clavier */
	if (fgets(Buffer, 100, stdin) != NULL) /* Pas d'erreur de saisie ? (Buffer de 100 caractères) */
	{
		positionEntree = strchr(Buffer, '\n'); /* On recherche l'"Entrée" */
		if (positionEntree != NULL) /* Si on a trouvé le retour à la ligne */
		{
			*positionEntree = '\0'; /* On remplace ce caractère par \0 */
		}
		else
		{
			viderBuffer();
		}
		
		return 1; /* On renvoie 1 si la fonction s'est déroulée sans erreur */
	}
	else
	{
		viderBuffer();
		return 0; /* On renvoie 0 s'il y a eu une erreur */
	}
}



et viderBuffer :

void viderBuffer()
{
	int c = 0;
	while (c != '\n' && c != EOF)
	{
		c = getchar();
	}
}


Pourriez vous m'aider ?


Configuration: Macintosh / Safari 14.0

1 réponse

Messages postés
13910
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 janvier 2021
783
bonjour,
tu pourrais t'aider en publiant ton programme complet, et en indiquant clairement ce que tu réponds, et tout ce qui est affiché par le programme.
Ok je vois.

Voilà un exemple :

ruben@iPhone-de-Ophelie-2 Base_de_faits % gcc *.c -ob
ruben@iPhone-de-Ophelie-2 Base_de_faits % ./b
(1) ajouter fait, (2) suite 1

Fait à ajouter ? Il pleut
nouveau tour
(1) ajouter fait, (2) suite 1

Fait à ajouter ? Le sol est mouillé
nouveau tour
(1) ajouter fait, (2) suite 2
On passe à la suite
nouveau tour
zsh: segmentation fault ./b


Et voici mon main :

#include <stdlib.h>
#include <stdio.h>
#include "Bf.h"


int main()
{

	BaseFaits bf = NULL;

	bf = creer_Bf();
	

	printf("%s->%s, taille : %d",bf->tête->fait, bf->queue->fait, bf->taille_base);


	bf = effacer_Bf(bf);

}
Messages postés
13910
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 janvier 2021
783 > Ruben
tu ne montres toujours qu'une partie de ton programme.
as-tu essayé d'ajouter
\n
à la fin de chaque printf?
>
Messages postés
13910
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 janvier 2021

Oui ça ne change rien.

Du coup voici mon type abstrait BaseFaits :

#ifndef __Bf__h__
#define __Bf__h__

	typedef enum BOOL{
		false,
		true
	}BOOL;

/*Definition d'un élément de la liste */
	
	typedef struct elem{
		char *fait;
		struct elem *suiv;
	}Fait;

/*Definition de la Base de Faits*/

	typedef struct base{
		int taille_base;
		struct elem *tête;
		struct elem *queue;
	}*BaseFaits;


/*Prototypes */
	
	BaseFaits nouvelle_Bf(void);
	BOOL estNulle_Bf(BaseFaits b);
	BaseFaits ajouter_Fait(BaseFaits b, char* f);
	BaseFaits creer_Bf();
	BaseFaits effacer_Bf(BaseFaits b);
	
#endif


Et la fonction nouvelle_Bf() utiliser au début de creer_Bf ne fait que renvoyer NULL.
Messages postés
13910
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
16 janvier 2021
783 > Ruben
la fonction
ajouter_Fait()
est-elle secrète?
as-tu testé en retirant de main() les instruction après
bf = creer_Bf();
?