Programme C++ avec saisi du code caché par des étoiles ( * )

Résolu
Source_code06 Messages postés 5 Date d'inscription samedi 18 mars 2017 Statut Membre Dernière intervention 19 mars 2017 - Modifié par cptpingu le 18/03/2017 à 16:41
Source_code06 Messages postés 5 Date d'inscription samedi 18 mars 2017 Statut Membre Dernière intervention 19 mars 2017 - 18 mars 2017 à 17:44
Bonjour à tous.

J'ai créé récemment un petit programme en C++ avec un système de code et j'aimerais savoir comment remplacer la saisi d'un code par des étoile (*).

Merci ;)

Voici le code source:

#include <iostream> 
using namespace std;

int main()
{
   int cOde(0);

cout << " ///DOSSIERS SECRET/// " << endl;
 cout << " " << endl;
 cout << " " << endl;
 cout << "Saisir le code ==>" " " , cin >> cOde;
 cout << " " << endl;

if (cOde ==0000)

{
        int a (0);

cout << "--------------------" << endl;
  cout << " *ACCES AUTORISE* " << endl;
    cout << "--------------------" << endl;
  cout << " " << endl;
  cout << " Voulez-vous acceder au informations ? " << endl;
  cout << " " << endl;
  cout << " oui= 1 " << endl;
  cout << " non= 2 " << endl;
  cout << " " << endl;
  cout << " Votre reponse ==> " " ",cin >> a;
  cout << " " << endl; 


if ( a==1 )
 {
    cout << " " << endl;
    cout << "-----------------------------------" << endl;
    cout << " Voici les informations: " << endl;
    cout << " " << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << ".........................." << endl;
    cout << " " << endl;
    cout << "-----------------------------------" << endl;
 }

else if ( a==2 )
    {
     cout << " " << endl;
     cout << " Bien, votre reponse a bien etes pris en compte " << endl;
  cout << " " << endl; 
    }     

else if ( a==0)
    {
      cout << "--------------------------------------------" << endl;
   cout << " EUREUR: " << endl;
   cout << " " << endl;
   cout << "*/*/Ceci n'est pas une reponse possible !/*/" << endl; 
   cout << "--------------------------------------------" << endl;
 }

else if (a >=3)
 {
   cout << "--------------------------------------------" << endl;
   cout << " EUREUR: " << endl;
   cout << " " << endl;
   cout << "*/*/Ceci n'est pas une reponse possible !/*/" << endl; 
   cout << "--------------------------------------------" << endl; 
 } 

}

else if (cOde <0000)
    {
     cout << "-------------------------" << endl;
        cout << " EREUR: *ACCES REFUSE* ! " << endl;
        cout << "-------------------------" << endl;
    }

else if (cOde >0000)
    {
        cout << "-------------------------" << endl;
     cout << " EREUR: *ACCES REFUSE* ! " << endl;
        cout << "-------------------------" << endl;
    }


int quiTer(1);
 cout << " " << endl;
 cout << " Voulez-vous quitter ? " << endl;
 cout << " " << endl;
 cout << " oui=1 " " " << endl;
 cout << " " << endl;
 cout << " Votre reponse ==> " , cin >> quiTer;

return 0;
}


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

Merci d'y penser dans tes prochains messages.

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 18/03/2017 à 16:46
Bonjour.

Tout d'abord, quelques conseils techniques:
  • N'utilise pas using namespace, c'est dégueux... Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
  • Enchaîne tes std::cout, plutôt que d'en refaire beaucoup à la suite (voir correction ci-dessous).
  • Révise ta logique, de nombreux tests sont inutiles, et on peut aisément écourter ton code.
  • 0000 et 0 c'est la même chose. Donc soit tu voulais dire "0000" soit mettre 0 suffit. J'ai considéré que tu voulais mettre un code sous forme de message ("toto23", "0000", "pass", etc...) plutôt qu'un nombre.
  • Les accolades sont facultatives si tu n'as qu'une seule ligne à écrire à la suite de ta structure de contrôle.


Au niveau de ce que tu demandes, ce n'est pas possible en "C++ pur". La gestion du terminal ne dépend pas du langage, mais du système d'exploitation. Le C++ ne sait même pas ce qu'est un terminal !
En exploitant les API de ton système d'exploitation, on peut se débrouiller pour que ça fonctionne, mais le code sera différent sur chaque plateforme. Le code est particulièrement difficile à écrire si tu débutes (c'est une fonctionnalité très avancé). Je t'ai fais un exemple pour Linux (je n'ai pas Windows), pour te montrer comment faire, mais ne te prends pas la tête avec ça. C'est juste un détail d'affichage et il y a des choses plus importantes que d'afficher des étoiles.

Correction code:
#include <iostream>

int main()
{
  std::string code = "";
  std::cout << " ///DOSSIER SECRET///\n\n\n"
            << "Saisir le code ==>";
  std::cin >> code;

  if (code == "0000")
  {
    int answer = 0;

    std::cout << "--------------------\n"
              << " *ACCES AUTORISE*\n"
              << "--------------------\n\n"
              << " Voulez-vous acceder aux informations ?\n\n"
              << " oui = 1\n"
              << " non = 2\n\n"
              << " Votre reponse ==> ";
    std::cin >> answer;

    if (answer == 1)
      std::cout << "-----------------------------------\n"
                << " Voici les informations:\n\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n\n"
                << "-----------------------------------" << std::endl;
    else if (answer == 2)
      std::cout << "\nBien, votre reponse a bien ete prise en compte" << std::endl;
    else
      std::cout << "--------------------------------------------\n"
                << " ERREUR:\n\n"
                << "*/*/Ceci n'est pas une reponse possible !/*/\n"
                << "--------------------------------------------" << std::endl;
  }
  else
    std::cout << "-------------------------\n"
              << " ERREUR: *ACCES REFUSE* !\n"
              << "-------------------------" << std::endl;

  int stop = 1;
  std::cout << "\nVoulez-vous quitter ?\n\n"
            << "oui = 1\n\n"
            << " Votre reponse ==> ";
  std::cin >> stop;

  return 0;
}


Amélioration code avec sélection d'un masque (ici en étoile):
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <termios.h>
#include <unistd.h>

ssize_t internal_getpass(char** pw, size_t sz, int mask, FILE* fp)
{
  if (!pw || !sz || !fp)
    return -1;

  if (*pw == 0)
  {
    char* tmp = (char*)realloc(*pw, sz * sizeof **pw);
    if (!tmp)
      return -1;
    memset(tmp, 0, sz);
    *pw = tmp;
  }

  size_t idx = 0;
  int c = 0;

  struct termios old_kbd_mode;
  struct termios new_kbd_mode;

  if (tcgetattr(0, &old_kbd_mode))
  {
    fprintf(stderr, "%s() error: tcgetattr failed.\n", __func__);
    return -1;
  }
  memcpy(&new_kbd_mode, &old_kbd_mode, sizeof(struct termios));

  new_kbd_mode.c_lflag &= ~(ICANON | ECHO);
  new_kbd_mode.c_cc[VTIME] = 0;
  new_kbd_mode.c_cc[VMIN] = 1;
  if (tcsetattr(0, TCSANOW, &new_kbd_mode))
  {
    fprintf(stderr, "%s() error: tcsetattr failed.\n", __func__);
    return -1;
  }

  while (((c = fgetc (fp)) != '\n' && c != EOF && idx < sz - 1) ||
         (idx == sz - 1 && c == 127))
  {
    if (c != 127)
    {
      if (31 < mask && mask < 127)
        fputc(mask, stdout);
      (*pw)[idx++] = c;
    }
    else if (idx > 0)
    {
      if (31 < mask && mask < 127)
      {
        fputc(0x8, stdout);
        fputc(' ', stdout);
        fputc(0x8, stdout);
      }
      (*pw)[--idx] = 0;
    }
  }
  (*pw)[idx] = 0;

  if (tcsetattr (0, TCSANOW, &old_kbd_mode))
  {
    fprintf(stderr, "%s() error: tcsetattr failed.\n", __func__);
    return -1;
  }

  if (idx == sz - 1 && c != '\n')
    fprintf(stderr, " (%s() warning: truncated at %zu chars.)\n", __func__, sz - 1);

  return idx;
}

std::string getPassword(char mask)
{
  char pw[256] = {0};
  char* p = pw;
  size_t nchr = internal_getpass(&p, 256, mask, stdin);

  return std::string(p, nchr);
}

int main()
{
  std::cout << " ///DOSSIER SECRET///\n\n\n"
            << "Saisir le code ==>";
  std::string code = getPassword('*');

  if (code == "0000")
  {
    int answer = 0;

    std::cout << "--------------------\n"
              << " *ACCES AUTORISE*\n"
              << "--------------------\n\n"
              << " Voulez-vous acceder aux informations ?\n\n"
              << " oui = 1\n"
              << " non = 2\n\n"
              << " Votre reponse ==> ";
    std::cin >> answer;

    if (answer == 1)
      std::cout << "-----------------------------------\n"
                << " Voici les informations:\n\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n"
                << "..........................\n\n"
                << "-----------------------------------" << std::endl;
    else if (answer == 2)
      std::cout << "\nBien, votre reponse a bien ete prise en compte" << std::endl;
    else
      std::cout << "--------------------------------------------\n"
                << " ERREUR:\n\n"
                << "*/*/Ceci n'est pas une reponse possible !/*/\n"
                << "--------------------------------------------" << std::endl;
  }
  else
    std::cout << "-------------------------\n"
              << " ERREUR: *ACCES REFUSE* !\n"
              << "-------------------------" << std::endl;

  int stop = 1;
  std::cout << "\nVoulez-vous quitter ?\n\n"
            << "oui = 1\n\n"
            << " Votre reponse ==> ";
  std::cin >> stop;

  return 0;
}


Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Source_code06 Messages postés 5 Date d'inscription samedi 18 mars 2017 Statut Membre Dernière intervention 19 mars 2017
Modifié par Source_code06 le 18/03/2017 à 17:50
Je débute en C++ et j'apprende avec openclass room et j'ai pas très bien compris pour quoi on pouvez pas remplacez la saisi par des etoile mes je te fait confiance tu a l'air fort dans ce domain, et j'ai esser le deuxieme sour code que ta mis avec des etoile et sa n'a pas marcher !?!? je suis sous Windows 10 et mon IDE c'est dev C++

merci ;)
0
Rejoignez-nous