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