Problème fonction (switch, buffer)

Fermé
Ruben - Modifié le 3 janv. 2021 à 13:24
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 - 3 janv. 2021 à 16:02
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
A voir également:

1 réponse

yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 Ambassadeur 1 557
3 janv. 2021 à 13:58
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.
1
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);

}
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > Ruben
3 janv. 2021 à 14:48
tu ne montres toujours qu'une partie de ton programme.
as-tu essayé d'ajouter
\n
à la fin de chaque printf?
0
Ruben > yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024
Modifié le 3 janv. 2021 à 15:16
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.
0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > Ruben
3 janv. 2021 à 16:02
la fonction
ajouter_Fait()
est-elle secrète?
as-tu testé en retirant de main() les instruction après
bf = creer_Bf();
?
0