Programme C++ avec saisi du code caché par des étoiles ( * ) [Résolu]

Source_code06 5 Messages postés samedi 18 mars 2017Date d'inscription 19 mars 2017 Dernière intervention - 18 mars 2017 à 12:48 - Dernière réponse : Source_code06 5 Messages postés samedi 18 mars 2017Date d'inscription 19 mars 2017 Dernière intervention
- 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.
Afficher la suite 

2 réponses

Répondre au sujet
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 18/03/2017 à 16:46
0
Utile
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
Commenter la réponse de cptpingu
Source_code06 5 Messages postés samedi 18 mars 2017Date d'inscription 19 mars 2017 Dernière intervention - Modifié par Source_code06 le 18/03/2017 à 17:50
0
Utile
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 ;)
Commenter la réponse de Source_code06

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.