IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

code de saisie de mot de passe -> mauvaise conversion


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut code de saisie de mot de passe -> mauvaise conversion
    Bonjour,

    En ayant fait un code de saisie de mot de passe lequel permet d'une part de masquer les caractères saisies et deplus avertit si le nombre de caractères à saisir est dépassé. Le programme compile très bien sous DevC++

    Ma première question est-ce que le code n'est pas trop lourd aurais je pu faire ça en une ou deux fonctions simples?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #include <conio.h>
    #include <string.h>
    #include <stdio.h>
     
    #define BEL 7
    #define BS 8
     
     
    unsigned int typeutil; 
     
    int verifie_passe(char tentative[])
    {
       char passe[] = "sesame";
       int pos_caractere = 0;
       do
       {
          if (passe[pos_caractere] != tentative[pos_caractere])
             return 0;
          pos_caractere++;
       } while (passe[pos_caractere] != '\0');
       return 1;
    }
     
    char *lire_mp (void)
    {
       static char tampon[8];
       size_t i = 0;
       char lettre;
     
       while ((lettre = getch ()) != '\r')
       {
          if (lettre == BS)
          {
             if (i > 0)
             {
                putch (lettre);
                putch (' ');
                putch (lettre);
                i--;
             }
             else
             {
                putchar (BEL);
             }
          }
          else
          {
             if (i < sizeof tampon - 1)
             {
                tampon[i] = lettre;
                i++;
                putch ('*');
             }
             else
             {
                putchar (BEL);
             }
          }
       }
     
       tampon[i] = 0;
       return tampon;
    }
     
    void Users_mode()
    {
    unsigned char choiceuser; 
    unsigned char pass[5]; 
    int num_tries =0;  
    typeutil=0;   
    printf("Would you like to enter in administrator mode (Y/N) ?\n\n");   
     
      choiceuser=getchar();  
       if((choiceuser=='Y')||(choiceuser=='y'))     
       {  
       char tentative[81];
       char *pwd;
       do
       {
     
          printf("\nEntrez le mot de passe :\n");
          pwd = lire_mp ();
       } while (verifie_passe(pwd) == 0);
       printf("\nbienvenue\n");
     
                typeutil = 1;
                printf("You are in administrator mode \n"); 
     
       }
     
       if((choiceuser=='N')||(choiceuser=='n'))
       {
    	typeutil = 0;
        //printf("You aren't in administrator mode \n"); 
       }
    }
     
    int main()
     
    {
        //unsigned int typeutil; 
        Users_mode(); 
        getchar();
        getchar();
        return 0;
     
    }
    Et ma seconde question c'est que travaillant dans un système embarqué à base de microcontrolleur j'ai un compilateur specifique, mon compilateur est Keil C51 µVisoin2 quand je compile ce code j'ai un warning :

    *** WARNING C318 IN LINE 25 OF ADC.c: can't open file 'conio.h'

    Et puis j'ai un problème d' error :

    error C267: 'putch': requires ANSI-style prototype

    à ce niveau de mon code :

    putch (lettre);



    en utilisant ceci: puts (lettre);

    alors j'ai ce problème :

    ADC.C(1147): error C214: illegal pointer conversion


    Je ne sais pas comment integrer ce code ?


    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    putchar(), fputc()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Oui avec putchar(), ça compile bien par contre j'ai un autre soucis cette fois
    mon programme reboot lorsque je veux entrer en mode administrateur, c'est à dire lorsque je tape 'y' ou 'Y' ça bug quelque part mais je sais pas pourquoi ?

    Si je tape 'n' ou 'N' le programme tourne bien.

    Merci

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Aliveli
    En ayant fait un code de saisie de mot de passe lequel permet d'une part de masquer les caractères saisies et deplus avertit si le nombre de caractères à saisir est dépassé. Le programme compile très bien sous DevC++

    Ma première question est-ce que le code n'est pas trop lourd aurais je pu faire ça en une ou deux fonctions simples?
    Simplification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #include <conio.h>
    #include <string.h>
    #include <stdio.h>
     
    #define BEL 7
    #define BS 8
     
    int verifie_passe (char const tentative[])
    {
       char const passe[] = "sesame";
       return strcmp (tentative, passe) == 0;
    }
     
    void lire_mp (char *tampon, size_t size)
    {
       size_t i = 0;
       char lettre;
     
       while ((lettre = getch ()) != '\r')
       {
          if (lettre == BS)
          {
             if (i > 0)
             {
                putch (lettre);
                putch (' ');
                putch (lettre);
                i--;
             }
             else
             {
                putchar (BEL);
             }
          }
          else
          {
             if (i < size - 1)
             {
                tampon[i] = lettre;
                i++;
                putch ('*');
             }
             else
             {
                putchar (BEL);
             }
          }
       }
     
       tampon[i] = 0;
    }
     
    void Users_mode (void)
    {
       unsigned char choiceuser;
       int typeutil = 0;
       printf ("Would you like to enter in administrator mode (Y/N) ?\n\n");
     
       choiceuser = getchar ();
       if ((choiceuser == 'Y') || (choiceuser == 'y'))
       {
          char pwd[8];
          do
          {
             printf ("\nEntrez le mot de passe :\n");
             lire_mp (pwd, sizeof pwd);
          }
          while (verifie_passe (pwd) == 0);
          printf ("\nbienvenue\n");
     
          typeutil = 1;
          printf ("You are in administrator mode \n");
     
       }
     
       if ((choiceuser == 'N') || (choiceuser == 'n'))
       {
          typeutil = 0;
          //printf("You aren't in administrator mode \n");
       }
    }
     
    int main (void)
    {
       Users_mode ();
       return 0;
    }
    Et ma seconde question c'est que travaillant dans un système embarqué à base de microcontrolleur j'ai un compilateur specifique, mon compilateur est Keil C51 µVisoin2 quand je compile ce code j'ai un warning :

    *** WARNING C318 IN LINE 25 OF ADC.c: can't open file 'conio.h'

    Et puis j'ai un problème d' error :

    error C267: 'putch': requires ANSI-style prototype
    C'est clair que putch() et getch() sont des fonctions non portables (tout comme conio.h>)

    Il faut donc, soit trouver un équivalent sur ton compilateur (c'est probable), soit les coder soi même. Tu communiques par le port série ?

  5. #5
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Merci Emmanuel,

    Je vais tester le code simplifié sinon je lirais
    la doc du compilateur.

    Merci

  6. #6
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Après avoir tester le nouveau code le programme redemarre pas mais il y a un autre petit soucis toujours malheureusement.

    Ca bug se fait à l'appel au niveau de la fonction users_mode():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             lire_mp (pwd, sizeof pwd);
          }
          while (verifie_passe (pwd) == 0);
    lorsque la fonction lire_mp() est appelée ( je l'ai verifié avec debug )

    C'est un problème de code dans le getch du while de la fonction lire_mp():


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
       while ((lettre = getchar ()) != '\r')
       {
          if (lettre == BS)
          {
    
             if (i > 0)
             {
                putchar (lettre);
                putchar (' ');
                putchar (lettre);
                i--;
             }
             else
             {
                putchar (BEL);
             }
          }
          else
          { 
    
             if (i < size - 1)
             {
                tampon[i] = lettre;
                i++;
                putchar ('*');
             }
             else
             {
                putchar (BEL);
             }
          }
    
       }
    en effet en ayant mis getchar à la place de getch, ça va deja mieux car le programme ne redemarre pas mais le resultat est bizarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Would you like to enter in administrator mode (Y/N) ?
     
    y
    Entrez le mot de passe :
    se*s*a*s*m*e*s*s
    sesmed
     
    seememds
    s
    sme
    e
    e
    On ne sort plus de la saise et après le 7 ème étoile on entend le beep à chaque saisie sur le clavier indefiniment je ne voit pas comment faire ?


    Merci

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Aliveli
    C'est un problème de code dans le getch du while de la fonction lire_mp():
    Pourquoi as-tu remplacé getch() par getchar() ? Ces fonctions n'ont absolument pas le même comportement et ne sont absolument pas interchangeables.

  8. #8
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    J'ai simplement changer getch() par getchar() pour essayer de trouver une solution pour que le programme ne redemarre plus .

    Mais apparement c'est pas une bonne solution ?
    Là je sais pas pour quelles rqisons ça redemarre?


    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA]Comment, dans le code VBA, hasher un mot de passe ?
    Par lord abortion dans le forum VBA Access
    Réponses: 6
    Dernier message: 18/04/2007, 16h41
  2. Saisie de mot de passe
    Par jonny_the_dog dans le forum C++
    Réponses: 1
    Dernier message: 12/01/2007, 00h27
  3. Pb de sécurité, de saisie de mot de passe
    Par gui38 dans le forum Sécurité
    Réponses: 4
    Dernier message: 06/06/2006, 10h45
  4. [Forum] Saisie de mot de passe pour login
    Par Alexlesilex dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 24/04/2006, 16h39
  5. cacher la saisie du mot de passe
    Par Antoine_1977 dans le forum Modules
    Réponses: 5
    Dernier message: 23/09/2005, 18h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo