2016-04-27 3 views
-3

Dies ist ein Teil des Programms, das ich in Turbo C++ machen muss; Hier, wenn ich ID als "PLAYNOW" eingeben und als "PASSWORD" übergeben, speichert Variable p den Wert 0, aber ich speichere nicht. ID-Variable speichert am Ende von PLAYNOW eine Junk-Nummer und ich kann nicht herausfinden warum. Bitte helfen Sie. Bitte ignorieren Sie nicht hinzugefügte Header-Dateien und die Art und Weise, wie ich das Passwort eingegeben habe. Vielen Dank!Programm in C++ zum Speichern von ID und Passwort

#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' Denken Sie daran, dass' char' ein einzelnes Zeichen ist. Vielleicht willst du 'const char *' oder besser noch 'std :: string' verwenden. – drescherjm

+1

in der Tat ist es schwer zu glauben, dass dieser Code kompiliert, strcmp sollte nicht akzeptieren, ein char als Argument – pm100

+1

*** Ich bin verpflichtet, in Turbo C++ machen *** Stellen Sie sicher, wenn Sie gehen in Programmierung, die Sie einige Zeit widmen lernen Sie einen modernen 'C++' Compiler. Turbo C++ war vor 25 Jahren gut, aber das war vor der 'C++' Standardisierung. Seitdem hat sich viel verändert. – drescherjm

Antwort

0

Nun, darüber hinaus zahlreiche Fehler, die ich einfach nicht zur Liste beginnen, ich sehe, dass Sie von einem char-Stream lesen, ohne den Strom Größe zu geben. Versuchen:

cin.getline(pass, 8);

Ich würde ernsthaft erwägen, einen Compiler, der ein bisschen neuer ist, und mehr auf die Lesbarkeit und Konvention konzentriert, wie es ist klar, dass es bessere Möglichkeiten zu tun, was letztlich hier getan wird. Gerade mit der von mir hervorgehobenen Linie ist das sehr ad hoc. Was ist, wenn die Zeichenfolge länger/kürzer als 8 Zeichen ist?

1

Wenn id und pass "PLAYNOW" und "PASSWORD" sind, hat id Länge 8 und pass hat Länge ist 9 (NULL Zeichen am Ende der Zeichenfolge).

Ich habe wie folgt geändert und das Ergebnis in cmd ist Willkommen.

char id [8], bestanden [9];

...

cin.getline (id, 8);

char idc [] = "PLAYNOW";

char passc [] = "KENNWORT";

...

cin.getline (Pass, 9);

...

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

2

Ein Problem in der OP-Code die unzureichende Menge an Speicher für die Variablen zugeordnet ist. Zum Beispiel mit jenen Linien:

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

Die Funktion getline aus dem Eingangsstrom bis Zeichen in den null beendetid char Array lesen und speichern kann, aber dann muss das Programm die Zeichenfolge vergleichen, zu PLAYNOW, die Zeichen lang ist.

Dies führt zum nächsten Problem, wenn getline ungelesene Zeichen im Stream lässt, wird das Failbit gesetzt, was weitere Lesungen verhindert.

diejenigen zu beheben, auch mit dem alten Standard, OP kann etwas tun:

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 
} 

Das gleiche gilt für pass (OP nicht 8 auf den zweiten getline bestanden hat, auch).

Dann sind die Deklarationen der Zeichenfolgen falsch, die die erwartete ID und das Kennwort enthalten. Verwenden denen:

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

Die letzten Zeilen zu neu geschrieben werden:

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

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

return 0;  // end of main() 

BTW, ich bin ziemlich sicher, dass std::string s gehörte C++ 98, so sollte dies auch funktionieren:

Verwandte Themen