Lecture d'une pile en C

Résolu
Bonsoir,

j'ai un code où j'ai crée une structure. Je rentre des données dans la pile et j'essaye de les afficher mais ça ne fonctionne pas l'affichage... Je pense que c'est quelque chose comme "fflush(stdin)" qu'il faut ou autre chose. Je poste ici mon code pour que vous y jetiez un coup d'œil...

===========>

#include <stdio.h>
#include <stdlib.h>
#define N 50

typedef struct liste
{
    char nom[N];
    char prenom[N];
    int age;
    struct liste *suivant;
}Liste;



int main()
{
    int choice=0, j, i;
    int  cpt=0, pos=0;
    char choix;
    Liste *pbase, *ptrav, *pbis;
    pbase=NULL;
    do
    {


        printf("\n==================MENU=====================\n");
        printf("-1- introduire les donnees de la pile\n");
        printf("-2- afficher les donnees de la pile\n");
        printf("-3- compteur de la pile\n");
        printf("-4- insertion apres le Neme element\n");
        printf("-5- insertion avant le Neme element\n");
        printf("votre choix===>");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1 :

            printf("Introduire...O/N===>");
            scanf("%s", &choix);

            do
            {
                ptrav=malloc(sizeof(Liste));
                ptrav->suivant=pbase;
                pbase=ptrav;
                printf("nom : ");
                scanf("%s", &ptrav->nom[N]);
                printf("prenom : ");
                scanf("%s", &ptrav->prenom[N]);
                printf("age : ");
                scanf("%d", &ptrav->age);
                printf("Introduire...O/N===>");
                scanf("%s", &choix);

            }
            while (choix=='O');
            break;
        case 2 :

            ptrav=pbase;


            while (ptrav != NULL)
            {

                printf("%s\n", ptrav->nom);
                printf("%s\n", ptrav->prenom);
                printf("%d\n", ptrav->age);
                ptrav=ptrav->suivant;


            }
            break;
        case 3 :

            ptrav=pbase;

            while (ptrav != NULL)
            {
                ptrav=ptrav->suivant;
                cpt++;
            }

            printf("compteur = %d ", cpt);
            cpt=0;
            break;

        case 4 :
            ptrav=pbase;
            pbis=(Liste *)malloc(sizeof(Liste));
            printf("nom : ");
            scanf("%s", &pbis->nom[N]);
            printf("prenom : ");
            scanf("%s", &pbis->prenom[N]);
            printf("age : ");
            scanf("%d", &pbis->age);
            printf("position a inserer : ");
            scanf("%d", &pos);

            for (j=1;j<pos;j++)
                ptrav=ptrav->suivant;
            pbis->suivant=ptrav->suivant;
            ptrav->suivant=pbis;
            ptrav=pbase;
            break;
        case 5 :
            ptrav=pbase;
            pbis=(Liste *)malloc(sizeof(Liste));
            printf("nom : ");
            scanf("%s", &pbis->nom[N]);
            printf("prenom : ");
            scanf("%s", &pbis->prenom[N]);
            printf("age : ");
            scanf("%d", &pbis->age);
            printf("position a inserer : ");
            scanf("%d", &pos);

            if (pos==1)
            {
                pbis->suivant=pbase;
                pbase=pbis;
                ptrav=pbase;
            }
            else
            {
                for (i=1;i<pos-1;i++)
                    ptrav=ptrav->suivant;

                pbis->suivant=ptrav->suivant;
                ptrav->suivant=pbis;
                ptrav=pbase;
            }
            break;



        }

    }
    while (choice!=0);

    return 0;

}


Merci d'avance pour vos interventions...
Configuration: Linux
Firefox 3.0.5

6 réponses

  1. ok,

    je pense avoir compris...Encore merci pour tes explications

    Bonne soirée
    0
    1. Modérateur
      Re,

      En fait il faut t'imaginer ce qui se passe quand tu tapes au clavier
      L'emplacement de getchar est plutôt après l'âge.

      Par exemple, si tu tapes l'âge 10 et tu fais ENTRER, vu que ta variable lit l'entier il reste quand même le caractère '\n' qui est obtenu par l'action de la touche ENTRER.
      Ce caractère il faut l'avaler pour qu'il ne soit pas lu par le prochain scanf.
      0
      1. nom c'est une chaîne de caractère et le nom c'est l'adresse du 1er pointeur donc pas besoin &
        ensuite [N] on l'utilise pour la déclaration mais pas pour le scanf 


        oui exact, j'ai fait une grosse boulette!!!!
        0
        1. magnifique ça fonctionne...

          Pourquoi???? Je ne comprend pas bien le getchar()

          Merci d'avance...
          0
          1. Modérateur
            Re,

            Je ne comprends pas
            scanf("%s", &pbis->nom[N]);

            nom c'est une chaîne de caractère et le nom c'est l'adresse du 1er pointeur donc pas besoin &
            ensuite [N] on l'utilise pour la déclaration mais pas pour le scanf
            0
            1. Modérateur
              Salut,

                          do
                          {
                              ptrav=malloc(sizeof(Liste));
                              ptrav->suivant=pbase;
                              pbase=ptrav;
                              printf("nom : ");
                              scanf("%s", ptrav->nom);
                              getchar();
                              printf("prenom : ");
                              scanf("%s", ptrav->prenom);
                              printf("age : ");
                              scanf("%d", &ptrav->age);
                              printf("Introduire...O/N===>");
                              scanf("%s", &choix);
              
                          }
              
              0