Comment afficher un mot de passe en étoiles dans un programmeC ?

Résolu/Fermé
anonyme9955 Messages postés 20 Date d'inscription dimanche 19 juin 2016 Statut Membre Dernière intervention 7 octobre 2018 - Modifié par baladur13 le 13/07/2016 à 11:05
anonyme9955 Messages postés 20 Date d'inscription dimanche 19 juin 2016 Statut Membre Dernière intervention 7 octobre 2018 - 17 mars 2017 à 18:01
Bonjour,

J'ai créé un programme de calculatrice dans lequel j'ai intégré un mot de passe(voir programme ci-dessous). Or je désirerais que ce mdp s'affiche avec des étoiles(****).
J'ai déjà cherché sur plusieurs sites, mais étant débutant les explications étaient trop compliquées...

Avez-vous une solution?

Merci d'avance.

PS: essayez de faire simple niveau explications svp!

Le programme:
mdp=Yen56


#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
int nombre1; 
int nombre2; 
int nombre3;
float nombre4;
int reponse;
int comparaison;
char motdepasse[8]={'\0','\0','\0','\0','\0','\0','\0','\0'};
char motdepasseessai[8]={'\0','\0','\0','\0','\0','\0','\0','\0'};
strcpy(motdepasse,"Yen56");

printf("Pour utiliser le programme, vous devez entrer le mot de passe.\n");
printf("Mot de passe:");
scanf("%s", motdepasseessai);

comparaison=strcmp(motdepasse, motdepasseessai);
if ((comparaison>0)||(comparaison<0))
{
 printf("Mauvais mot de passe.");
 exit;
}
else 
{
printf("Ceci est une calculatrice.\n");
printf("Vos choix d'operations:additions, soustractions, multiplication, divisions,\n calcul du perimetre d'un carre,calcul du perimetre d'un rectangle,\n calcul du perimetre d'un triangle, calcul de l'aire d'un carre,calcul de l'aire d'un rectangle,calcul de l'aire d'un trangle ou convertion de francs en euros. \n\n");
printf("Quel type d'operation voulez-vous effectuer?(inscrivez 1,2,3,4,5,6,7,8,9,10 \n ou 11)\n");
printf("Votre choix:");
scanf("%d", &reponse);



if (reponse==1)
{
 printf("somme de deux nombres entiers\n");
 printf("entrez le 1er nombre:");
 scanf("%d", &nombre1);
 printf("entrez le 2eme nombre:");
 scanf("%d", &nombre2);
 int resultat= nombre1+nombre2; 
 printf("%i + %i = %i\n",nombre1,nombre2,resultat ); 
} 

if (reponse==3)
{
 printf("multiplication de deux nombres entiers\n");
 printf("entrez le 1er nombre:");
 scanf("%d", &nombre1);
 printf("entrez le 2eme nombre:");
 scanf("%d", &nombre2);
 int resultat2= nombre1*nombre2; 
 printf("%i * %i = %i\n",nombre1,nombre2,resultat2 ); 
}


if (reponse == 4)
{
 printf("division de deux nombres entiers\n");
 printf("entrez le 1er nombre:");
 scanf("%d", &nombre1);
 printf("entrez le 2eme nombre:");
 scanf("%d", &nombre2);
 int resultat3 = nombre1 / nombre2; 
 int reste = nombre1%nombre2;
 printf("%i / %i = %i , reste %d\n",nombre1,nombre2,resultat3 , reste ); 
}

if (reponse==2)
{
 printf("soustraction de deux nombres entiers\n");
 printf("entrez le 1er nombre:");
 scanf("%d", &nombre1);
 printf("entrez le 2eme nombre:");
 scanf("%d", &nombre2);
 int resultat4 = nombre1 - nombre2; 
 printf("%i - %i = %i\n",nombre1,nombre2,resultat4  ); 
}

if(reponse==5)
{
 printf("calcul du perimetre d'un carre\n");
 printf("entrez la longueur d'un cote:");
 scanf("%d", &nombre1);
 int resultat5 = nombre1*4; 
 printf("Le perimetre de votre carre est:%d cm\n",resultat5 ); 
}

if(reponse==6)
{
 printf("calcul du perimetre d'un rectangle\n");
 printf("entrez la longueur du rectangle:");
 scanf("%d", &nombre1);
 printf("entrez la largeur du rectangle:");
 scanf("%d", &nombre2);
 int resultat6 =(nombre1+nombre2)*2; 
 printf("Le perimetre de votre rectangle est:%d cm\n",resultat6 ); 
}


if(reponse==7)
{
 printf("calcul du perimetre d'un triangle\n");
 printf("entrez la longueur du 1er cote du triangle:");
 scanf("%d", &nombre1);
 printf("entrez la longueur du 2eme cote du triangle:");
 scanf("%d", &nombre2);
 printf("entrez la longueur du 3eme cote du triangle:");
 scanf("%d", &nombre3);
 int resultat7 =nombre1+nombre2+nombre3; 
 printf("Le perimetre de votre triangle est:%d cm\n",resultat7 ); 
}


if(reponse==8)
{
 printf("calcul de l'aire d'un carre\n");
 printf("entrez la longueur d'un cote:");
 scanf("%d", &nombre1);
 int resultat8 = nombre1*nombre1; 
 printf("L'air de votre carre est:%d cm2\n",resultat8 ); 
}


if(reponse==9)
{
 printf("calcul de l'aire d'un rectangle\n");
 printf("entrez la longueur du rectangle:");
 scanf("%d", &nombre1);
 printf("entrez la largeur du rectangle:");
 scanf("%d", &nombre2);
 int resultat9 = nombre1*nombre2; 
 printf("L'aire de votre rectanle est:%d cm2\n",resultat9 ); 
}


if(reponse==10)
{
 printf("calcul de l'aire d'un triangle\n");
 printf("entrez la base du triangle:");
 scanf("%d", &nombre1);
 printf("entrez la hauteur du trangle:");
 scanf("%d", &nombre2);
 int resultat10 = (nombre1*nombre2)/2; 
 printf("L'aire de votre triangle est:%d cm2\n",resultat10 ); 
}


if(reponse==11)
{
 printf("convertion de francs en euros\n");
 printf("entrez le nombre de francs:");
 scanf("%f", &nombre4);
 float resultat11 = (float)nombre4/6.5; 
 printf("vous avez:%.2f euros\n",resultat11 ); 
}

 
}

 }

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

3 réponses

paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 2/07/2016 à 17:23
Il n'existe pas de fonction standard pour faire cela. Tout dépend donc de ta plateforme.

Sous windows, après recherche, la fonction getch() devrait faire l'affaire (le code suivant n'est pas testé) :

#include <conio.h> // header non standard, existe uniquement sous Windows.
#include <stdio.h>

int main(void) {
    char c, mot_de_passe[256] = "";
    int i = 0;
    while ((c=getch()) != '\n' && i < 255) {
        mot_de_pass[i] = c;
        printf("*");
        i++;
    }
    mot_de_passe[i] = '\0';

    printf("Le mot de passe est: %s\n", mot_de_passe);

    return 0;
}


Selon la doc, la fonction getch() récupère un caractère sans l'afficher. Et ensuite c'est nous qui affichons l'astérisque.

Pour GNU/Linux, à la place de conio.h, on peut modifier les attributs du terminal avec termios.h. Le code suivant est testé et fonctionne:

#include <stdio.h>
#include <termios.h> // header non standard, existe uniquement sous les systèmes POSIX

int main(void) {
 char mot_de_passe[256] = "";
 char c = 0;
 char *x = mot_de_passe;
 struct termios argin, argout;
 tcgetattr(0,&argin);
 argout = argin;
 argout.c_lflag &= ~(ICANON|ECHO);
 argout.c_iflag &= ~(ICRNL);
 argout.c_oflag &= ~(OPOST);
 argout.c_cc[VMIN] = 1;
 argout.c_cc[VTIME] = 0;
 tcsetattr(0,TCSADRAIN,&argout);
 do {
  if (read(0, &c, 1) != 1)
   continue;
  if (c == 0x0d)
   break;
  if ((c == 0x08) || (c == 0x7f)) { // backspace
   putchar(8);
   putchar(' ');
   putchar(8);
   x--;
  } else {
   *x++ = c;
   putchar('*');
  }
  fflush(stdout);
 } while (x-mot_de_passe < 255);
 *x = '\0';
 tcsetattr(0,TCSADRAIN,&argin);
 
 printf("Le mot de passe est: %s\n", mot_de_passe);
 
 return 0;
}


Dans ce code, on modifie les attributs du terminal pour enlever l'affichage des caractères saisis, on lit avec read(). Si c'est un caractère normal, on affiche une astérisque. On supporte aussi les backspaces (touche "retour arrière"), ce que ne fait pas le code avec getch() plus haut.


Si tu veux un code qui fonctionne sous les deux OS, tu peux utiliser les directives de préprocesseur:

#ifdef WIN32
/* code pour Windows */
#elif defined(linux)
/* code pour GNU/Linux */
#else
#error Votre systeme d'exploitation n'est pas supporte.
#endif




Note: hardcoder le mot de passe dans l'exécutable n'est vraiment pas une bonne idée niveau sécurité, si quelqu'un jette un oeil à l'intérieur de l'exécutable il le verra, sans aucune connaissance particulière.
Ici sous GNU/Linux, ton programme compilé avec GCC, l'exécutable ouvert avec gedit:

Il vaut mieux utiliser des techniques de chiffrement à la place, il en existe pleins.

La curiosité est une excellente qualité !
1
Merci paly2, je vais tester ton code.

Je suis désolé de vous demander ça en plus, mais pourriez-vous essayer d'intégrer ce bout de code au mien??

Merci d'avance!
0
Je viens de tester le code

<code c>
#include <conio.h>
#include <stdio.h>

int main(void) {
char c, mot_de_passe[256] = "";
int i = 0;
while ((c=getch()) != '\n' && i < 255) {
mot_de_passe[i] = c;
printf("*");
i++;
}
mot_de_passe[i] = '\0';

printf("Le mot de passe est: %s\n", mot_de_passe);

return 0;
}
<code>


Cela marche bien, sauf que quand j'appuie sur enter, cela affiche également une étoile!
J'aimerais pouvoir interrompre sans avoir a couper le programme.

As-tu une solution?

PS: la balise <code c> ne marche pas. pourquoi?
0