• [^] # Re: Un test...

    Posté par . En réponse au message problème avec la boucle do while. Évalué à 3.

    C'est parce que pour répondre à la question du scanf, vous appuyez sur entrée.

    Cette touche qui n'est pas avalée par le scanf est alors transmise à gets.

    Videz le tampon par un getch(stdin) ou getchar().

    Ensuite, si l'on tape un login de plus de 9 caractères, tout part en vrille.

    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    static struct termios before;
    void initTerm(void)
    {
     tcgetattr(0, &before);
    }
    void resetTerm(void)
    {
     tcsetattr(0, TCSANOW, &before);
    }
    void setTerm(int echo)
    {
     struct termios state;
     tcgetattr(0, &state);
     state.c_lflag &= ~ICANON;
     if (echo){
     state.c_lflag |= ECHO;
     } else {
     state.c_lflag &= ~ECHO;
     }
     tcsetattr(0, TCSANOW, &state);
    }
    int main()
    {
     char login[10];
     char mot[8], cg;
     size_t i;
     int rep;
     initTerm();
     do{
     printf("enter le login:");
     fgets(login,sizeof login,stdin);
     printf("enter le password:");
     setTerm(0);
     for(i=0;i<5;i++){
     cg = getchar();
     mot[i]=cg;
     cg='*';
     printf("%c",cg);
     }
     setTerm(1);
     mot[i]='0円';
     printf("\nnon(0) ou oui(1):");
     scanf("%d",&rep);
     getc(stdin);
     }while(rep==1);
     resetTerm();
     return 0;
    }

    Si l'on tape des logins trop longs, le buffer stdin va déborder de la même manière sur le getchar du mot de passe.