Passwort
-
hallo ihr lieben,
ich brauche mal eure Hilfe.
Also folgendes:
Ich arbeite an einem Projekt, wo der Admin Links über ein Formular eingeben oder löschen kann, jedoch erst wenn er das richtige Passwort eingegeben hat.
Das muss ich über C++ realisieren. Ich habe bisher folgenden Lösungsansatz:#include <iostream.h>
#include <string.h>
int main()
{int vergleich;
char Passwort[5],Passworteingabe[5];
cout << "Legen Sie ein 5-stelliges Passwort fest! ";
cin >> Passwort;
cout << "Vielen Dank! Das Passwort wurde gespeichert.\n";
cout << "\nGeben Sie das Passwort ein, um Zugriff auf die Daten zu haben!\n";
cin >> Passworteingabe;
vergleich=strcmp(Passworteingabe, Passwort);if(vergleich==0)
cout << "Das Passwort ist richtig!\n"
"Sie können jetzt Links hinzufügen oder löschen.\n";else cout << "Das Passwort ist falsch!"
"\nGeben Sie nochmal ein!\n";getchar();
}Das Problem hierbei ist jedoch, dass wenn er das passwort zur Bestätigung nochmal eingibt und dann aber einen Fehler macht er zwar sagt:
"Das Passwort ist falsch!"
"\nGeben Sie nochmal ein!\n";
jedoch bei der richtigen Eingabe nach dem enter abbricht und nicht sagt:
"Das Passwort ist richtig!\n"
"Sie können jetzt Links hinzufügen oder löschen.\n";Bitte um Lösungen!
Ich drehe sonst noch durch!
Eure susa
-
Ein Debugger ist die Lösung.
Bye, TGGC (Denken, und gut ist.)[/quote]
-
...dann wird der Fehler wohl in diesen zwei Zeilen liegen:
vergleich=strcmp(Passworteingabe, Passwort);
if(vergleich==0)na?
Übrigens: Sagt dir '\0' was?
warum benutzt du c-Strings und nicht die Klasse string, für die es auch den operator== gibt?
-
nein der verglcih funktioniert, einfach mal das getchar() gegen getch() tauschen...
EDIT: dazu muss leider conio inkludiert werden!
-
hi habe mal das conio inkludiert und aus getchar getch gemacht. - Bringt leider trotzdem nichts.
Von der Endekennung /0 hab eich auch gehört-weiss aber nicht so richtig wie und wo ich es einfügen muss.
BIN DOCH NOCH ANFÄNGER!
lg
-
äh ich meine natürlich \0 !
-
das problem ist möglicherweise, dass eine eingabe aus 5 sichtbaren zeichen nat. noch den terminator als 6. zeichen mitschleppt. das führt dann nat. zum pufferüberlauf in Passworteingabe. (und wenn jemand absichtlich längere strings eingibt, passiert das sowieso).
moral: std::string benutzen
-
hör auf camper und benutze std::string
oder lege deine c-strings ein Feld größer an und ergänze '\0'
dazu ein kleines Beispiel://Paßwort: //!!caution:<conio.h> is no standart!! do not use!! //getche();gibt echo aus #include <iostream> #include<conio.h> using namespace std; int main(){ const char PW[5]={'t','e','s','t','\0'}; char pw[5]; cout<<"Bitte Password eingeben!"<<endl; for(int i=0; i<4 ;i++){ pw[i] = getch(); cout<<"*"; } pw[4]='\0'; if( strcmp(pw,PW)==0 ){ cout<<"Password ist Richtig!"<<endl<<"Login erfolgreich!"<<endl; } else{ cout<<"Password ist Falsch!"<<endl; } return 0; }
-
so funktioniert es, hab es auf 4 rechnern, und 2 verschiedenen IDEs getestet!
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <iostream.h> #include <conio.h> using namespace std; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { int vergleich; char Passwort[5],Passworteingabe[5]; cout << "Legen Sie ein 5-stelliges Passwort fest! "; cin >> Passwort; cout << "Vielen Dank! Das Passwort wurde gespeichert.\n"; cout << "\nGeben Sie das Passwort ein, um Zugriff auf die Daten zu haben!\n"; cin >> Passworteingabe; vergleich=strcmp(Passworteingabe, Passwort); if(vergleich==0) cout << "Das Passwort ist richtig!\n" "Sie können jetzt Links hinzufügen oder löschen.\n"; else cout << "Das Passwort ist falsch!" "\nGeben Sie nochmal ein!\n"; getch(); return 0; } //---------------------------------------------------------------------------
-
warum nicht gleich:
if(Passworteingabe==Passwort){mach das} else{mach jenes};
???
-
enno-tyrant schrieb:
warum nicht gleich:
if(Passworteingabe==Passwort){mach das} else{mach jenes};
???
weil man nur arithmetische typen, enums und pointer vergleichen kann? (und klassen, für die ein op== definiert ist, klar) obiges würde also zum vergleich von pointern führen und nie war sein.
-
5er1al schrieb:
so funktioniert es, hab es auf 4 rechnern, und 2 verschiedenen IDEs getestet!
manchmal funktioniert es und es ist trotzdem falsch.
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <iostream.h> // du verwendest die alten header #include <conio.h> using namespace std; // mit alten headern nicht notwendig //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { int vergleich; char Passwort[5],Passworteingabe[5]; // du wilst ein 5-stelliges passwort siehe unten // dann sind fünf zeichen zuwenig ( ein fünfsstelliges passwort besteht aus 6 zeichen '\0' nicht vergessen cout << "Legen Sie ein 5-stelliges Passwort fest! "; cin >> Passwort; cout << "Vielen Dank! Das Passwort wurde gespeichert.\n"; cout << "\nGeben Sie das Passwort ein, um Zugriff auf die Daten zu haben!\n"; cin >> Passworteingabe; vergleich=strcmp(Passworteingabe, Passwort); if(vergleich==0) cout << "Das Passwort ist richtig!\n" "Sie können jetzt Links hinzufügen oder löschen.\n"; else cout << "Das Passwort ist falsch!" "\nGeben Sie nochmal ein!\n"; getch(); // mag ich persönlich überhaupt nicht. will das aber jetzt nicht erklären sonst wirds philosophisch return 0; } //---------------------------------------------------------------------------
BTW: habe obigen code auch mit g++ getestet und er läuft.
scheinbar reserviert g++ bei char s[5] auch auf dem stack mehr als 5 chars. ( padding ? )um nicht nur zu kritisieren.
ich würde es so machen.#include <iostream> #include <cstring> using namespace std; int main() { string Passwort,Passworteingabe; cout << "Legen Sie ein 5-stelliges Passwort fest! "; cin >> Passwort; cout << "Vielen Dank! Das Passwort wurde gespeichert.\n"; cout << "\nGeben Sie das Passwort ein, um Zugriff auf die Daten zu haben!\n"; cin >> Passworteingabe; if ( Passworteingabe == Passwort) cout << "Das Passwort ist richtig!\n" "Sie können jetzt Links hinzufügen oder löschen.\n"; else cout << "Das Passwort ist falsch!" "\nGeben Sie nochmal ein!\n"; return 0; }
K.
-
<cstring> ???
-
sorry
#include<string>
K.
-
@ZuK, der Quellcode war nich von mir...hab nur das getch() eingefügt, um zu demonstrieren,wie der Code rbei mir aussieht, und wo er funktioniert....verstehst?!
[EDIT] natürlich würd ich auch string nehmen...passwort verschlüsselt speichern etc...
-
wenn du verschlüsselst darfst du nat. keinen std:string nehmen. sonst gibt es keine garantie, dass es nicht doch irgendwo noch unverschlüsselt im speicher rumgeistert
-
na, wenn ich verschlüssel für die user, die mit dem prog umgehen, kann das ruhig im speicher rumgeistern...die wissen nichmal wasn speicher is...;)!
-
dann ist verschlüsseln eigentlich schon wieder zuviel aufwand, sternchen tuns auch - http://www.bash.org/?244321
-
naja, nen bisschen aufwand muss schon sein
-
bei euren Lösungsvorschlägen ist aber der Datenschutz nicht gewährleistet, denn man kann das Paßwort bei Eingabe auf dem Bildschirm sehen
(siehe dazu mein erster Beitrag)
cout<<"Bitte Password eingeben!"<<endl; for(int i=0; i<4 ;i++){ pw[i] = getch(); cout<<"*"; } pw[4]='\0';
-
Hallöchen @ all,
ich hätte nie mit so einer Resonanz und guten Tips gerechnet.
Ihr seit echt die ALLERBESTEN!!!!!!Programm läuft
-Dank Euch!
EURE susa:-)