Problème fonction (switch, buffer)

Ruben -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
    1. Ruben
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ruben
         
        tu ne montres toujours qu'une partie de ton programme.
        as-tu essayé d'ajouter
        \n
        à la fin de chaque printf?
        0
      2. Ruben > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        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
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Ruben
         
        la fonction
        ajouter_Fait()
        est-elle secrète?
        as-tu testé en retirant de main() les instruction après
        bf = creer_Bf();
        ?
        0