Problème fonction (switch, buffer)
Ruben
-
yg_be Messages postés 24281 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 24281 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 :
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 :
et viderBuffer :
Pourriez vous m'aider ?
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:
- Problème fonction (switch, buffer)
- Fonction si et - Guide
- Android switch - Accueil - Android
- Smart switch pc - Télécharger - Divers Bureautique
- Switch off - Télécharger - Divers Utilitaires
- Fonction miroir - Guide
1 réponse
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
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.
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.
Voilà un exemple :
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); }as-tu essayé d'ajouter à la fin de chaque printf?
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); #endifEt la fonction nouvelle_Bf() utiliser au début de creer_Bf ne fait que renvoyer NULL.
as-tu testé en retirant de main() les instruction après ?