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. 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
    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. magnifique ça fonctionne...

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

        Merci d'avance...
        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. 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. ok,

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

              Bonne soirée
              0