typedef struct and char in C programming

fogang fokoa Source

I find myself stuck for a few minutes on a piece of code that does not work as I wish. Indeed I would like to insert a character into a structure that contains an array of characters.

Here's an excerpt from the code snippet "automates.h":

void ajouterCaractere(Automate *automate) {
    if(automate->nbre_caracteres >= MAX_CARACTERES){
        printf("Vous avez deja atteint le nombre de caracteres maximal pour l'alphabet de votre automate !\n");
    }
    else {
        printf("Veuillez inserer un caractere dans alphabet :\n");
        scanf("%c",&automate->alphabet[automate->nbre_caracteres]);
        automate->nbre_caracteres++;
    }
}

// Remplir les états
void ajouterEtat(Automate *automate) {
    if (automate->nbre_etats >= MAX_ETATS) {
        printf("Vous avez deja atteint le nombre d'etats maximal pour votre automate !\n");
    }
    else {
        printf("Veuillez inserer un etat de votre automate :\n");
        scanf("%d", &automate->tableau_Etat[automate->nbre_etats]);
        automate->nbre_etats++;
    }
}

// Remplir les états initiaux
void ajouterEtatInitial(Automate *automate) {
    if (automate->nbre_etats_initiaux >= MAX_ETATS_INITIAUX) {
        printf("Vous avez deja atteint le nombre d'etats initiaux maximal pour votre automate !\n");
    }
    else {
        printf("Veuillez inserer les etats initiaux de votre automate :\n");
        scanf("%d",&automate->tableau_EI[automate->nbre_etats_initiaux]);
        automate->nbre_etats_initiaux++;
    }
}

// Remplir les états finaux
void ajouterEtatFinal(Automate *automate) {
    if (automate->nbre_etats_finaux >= MAX_ETATS_FINAUX) {
        printf("Vous avez deja atteint le nombre d'etats finaux maximal pour votre automate !\n");
    }
    else {
        printf("Veuillez inserer les etats finaux de votre automate :\n");
        scanf("%d",&automate->tableau_EF[automate->nbre_etats_finaux]);
        automate->nbre_etats_finaux++;
    }
}

// Remplir les transitions
void ajouterTransition(Automate *automate) {
    Transition transition;
    int i;

    if (automate->nbre_transitions >= MAX_TRANSITIONS) {
        printf("Vous avez deja atteint le nombre de transition maximal pour votre automate !\n");
    }
    else {
        printf("Transition %d\n", automate->nbre_transitions+1);
        printf("\t Etat de depart :   ");           /* L'état de départ de la transition */
        scanf("%d", &transition.etat_depart);
        printf("\t Etiquette :   ");                /* L'étiquette de la transition */
        scanf("%c", &transition.etiquette);         
        printf("\t Etat d'arrive :   ");            /* L'état d'arrivé de la transition */
        scanf("%d", &transition.etat_final);

        automate->tableau_transition[automate->nbre_transitions] = transition;
        automate->nbre_transitions++;
    }
}

Here's my main.c :

Automate *automate;
    int choix;

    automate = (Automate *) malloc (sizeof(Automate));
    if (automate == NULL)
        printf("Erreur lors de l'allocation de la mémoire à l'automate !\n");

    initialisation(automate);
    //consigne();
    while(choix != 6) {
        choix = menu(automate);
        switch(choix) {
            case 1:
                ajouterCaractere(automate);
                break;
            case 2:
                ajouterEtat(automate);
                break;
            case 3:
                ajouterEtatInitial(automate);
                break;
            case 4:
                ajouterEtatFinal(automate);
                break;
            case 5:
                ajouterTransition(automate);
                break;
            default :
                printf("Faites un choix correcte !");
                break;
        }
    }

When i compile i get this :

******** MENU ********
1.  Ajouter un caractere dans l'alphabet
2.  Quitter !
Faites votre choix :   
1
Veuillez inserer un caractere dans alphabet :

******** MENU ********
1.  Ajouter un caractere
2.  Ajouter un etat
3.  Ajouter un etat initial
4.  Ajouter un etat final
5.  Ajouter une transition
6.  Quitter
Faites votre choix :

As you can see, when I type 1, it does not allow to insert a character in the table.

How to fix this problem?

Thank you in advance !

cchartypedef

Answers

answered 2 months ago Barmar #1

The menu() function probably isn't reading the newline after the menu selection. Either fix that function, or change your scanf() format string to skip over whitespace before the character.

        scanf(" %c",&automate->alphabet[automate->nbre_caracteres]);

You should do the same thing for all the other scanf() operations that use %c.

A better option may be to use fgets() to read whole lines into strings, rather than using scanf() to read user input. You can use sscanf() to parse the input lines.

comments powered by Disqus