2016-04-27 2 views
-3

Ceci est une partie du programme que je suis obligé de faire dans Turbo C++; Ici, si je donne une entrée de id comme "PLAYNOW" et passe comme "PASSWORD", la variable p stocke la valeur 0 mais je ne stocke pas. La variable id stocke un certain nombre d'ordure à la fin de PLAYNOW et je ne suis pas capable de comprendre pourquoi. S'il vous plaît aider. S'il vous plaît ignorer les fichiers d'en-tête non ajoutés et la façon dont j'ai pris l'entrée du mot de passe. Merci!Programmer en C++ pour stocker ID et mot de passe

#include<conio.h> 
#include<iostream.h> 
#include<string.h> 
#include<process.h> 

int main() 
{ 
    char id[7],pass[8]; 
    cout<<"Enter id: "; 
    cin.getline(id,7); 
    cout<<"Enter pass: "; 
    cin.getline(pass); 
    char idc={"PLAYNOW"}; 
    char passc={"PASSWORD"}; 
    int i=strcmp(id,idc); 
    int p=strcmp(pass,passc); 

    if(i==0&&p==o) 
     cout<<"Welcome. "; 
    else 
     exit(0); 
    getch(); 
    return 0; 
} 
+2

'char idc' N'oubliez pas que' char' est un caractère unique. Peut-être que vous voulez 'const char *' ou mieux encore utiliser 'std :: string'. – drescherjm

+1

en fait il est difficile de croire que ce code compile, strcmp ne devrait pas accepter un char comme argument – pm100

+1

*** Je suis obligé de faire en Turbo C++ *** Assurez-vous que si vous allez dans la programmation que vous consacrez un certain temps à apprendre sur un compilateur 'C++' moderne. Turbo C++ était bon il y a 25 ans mais c'était avant la standardisation 'C++'. Beaucoup de choses ont changé depuis. – drescherjm

Répondre

0

Eh bien, au-delà de nombreuses erreurs que je ne peux pas commencer à la liste, je vois que vous lisez à partir d'un flux char sans donner la taille du cours d'eau. Essayez:

cin.getline(pass, 8);

je songerais sérieusement à l'aide d'un compilateur qui est un peu plus récent, et en se concentrant plus sur la lisibilité et la convention, car il est clair qu'il existe de meilleures façons de faire ce qui est en fin de compte se fait ici. Surtout avec la ligne que j'ai indiquée, c'est très ponctuel. Que faire si la chaîne est plus longue/plus courte que 8 caractères?

1

si id et pass sont "PLAYNOW" et "PASSWORD", id a une longueur de 8, et pass a une longueur de 9 (caractère NULL à la fin de la chaîne).

J'ai changé comme ci-dessous et l'impression du résultat dans cmd est bienvenue.

char id [8], passer [9];

...

cin.getline (id, 8);

char idc [] = "PLAYNOW";

char passc [] = "MOT DE PASSE";

...

cin.getline (col, 9);

...

if (i == 0 & & p == 0)

2

Un problème dans le code OP est la quantité insuffisante de mémoire allouée pour les variables. Par exemple, avec ces lignes:

char id[7]; 
cin.getline(id,7); 

La fonction getline peut lire et stocker à partir du flux d'entrée jusqu'à caractères dans la fin tableau de caractères nul id, mais le programme doit comparer cette chaîne à PLAYNOW, qui est caractères longs.

Cela conduit au prochain problème, lorsque getline laisse des caractères non lus dans le flux, l'échec est défini, empêchant toute autre lecture.

Pour fixer ceux-ci, même avec l'ancienne norme, OP peut faire quelque chose comme ceci:

const int ssize = 32;  // enough space to store id or password 
const int ssmax = 1024; 
// big value... ^^ try std::numeric_limits<std::streamsize>::max() instead 

char id[ssize], 
    pass[ssize]; 

cout << "Enter id: "; 
cin.getline(id, ssize);   // extract (ssize - 1) chars from input 
if ( cin.fail()) { 
    cin.clear();    // if user entered more then ssize chars 
    cin.ignore(ssmax, '\n'); // clear the stream 
} 

Même chose pour pass (OP n'a pas passé 8 au second getline, aussi). Ensuite, les déclarations des chaînes contenant l'ID et le mot de passe attendus sont erronées. Utilisez les:

char idc[] = "PLAYNOW"; 
char passc[] = "PASSWORD"; 

Les dernières lignes pourraient être réécrites aussi:

if (strcmp(id, idc) != 0 || strcmp(pass, passc) != 0) 
    exit(0); 

cout << "Welcome. "; 
cin.get(); 

return 0;  // end of main() 

BTW, je suis tout à fait sûr que std::string s appartenaient à 98 C++, ce qui devrait fonctionner aussi:

#include <iostream> 
#include <string> 

int main() { 
    std::string id, pass;  
    std::cout << "Enter id: "; 
    std::getline(std::cin, id);   
    std::cout << "Enter pass: "; 
    std::getline(std::cin, pass);    

    std::string idc("PLAYNOW"); 
    std::string passc("PASSWORD"); 

    if (idc != id || passc != pass) 
     exit(0); 

    std::cout << "Welcome. "; 

    return 0; 
}