Passwortabfrage mit string?!
-
Hi, hab da Mal ne Frage ^^
unzwar bin ich relativ neu in Sachen C und möchte ne Passwortabfrage programmieren.
Bis jez hab ichs mit Zahlen geschafft. D.h. das Passwort kann nur 12345 sein. Alles andere ist falsch.
Ich will aber eine Abfrage mit Buchstaben!
bis jetzt hab ich:
#include <stdio.h> #include <windows.h> int main(void) { char passwort[4]; printf("Hallo.\nGeben Sie das Passwort ein: "); scanf("%s", passwort); if(passwort == "test") { printf("Passwort korrekt!\n"); } system("PAUSE"); return 0; }
Aber wenn ich "test" eingebe, kommt nix.. Nur "Drücken Sie eine beliebige Taste ..."
Wo liegt das Problem?
Vielen Dank!!!!
-
Strings vergleicht man mit strcmp und nicht mit ==. Und "test" passt nicht in einen char[4] rein.
-
Ah okay.. also sollte es "if(passwort strcmp test)" heissen?
Wieviel chars brauch ich denn für "test" ?
Danke schonmal !!
-
meldino schrieb:
Ah okay.. also sollte es "if(passwort strcmp test)" heissen?
Nein, strcmp ist eine Funktion.
Wieviel chars brauch ich denn für "test" ?
-
Ah okay..
Also wie sollte der fertige Quelltext dann aussehen? :S
-
RTFM.
Wenn du C lernen willst dann rate nicht in der Gegend rum sondern lies ein Buch von vorne durch.
In diesem Fall genügt auch ein drittklassiges Online-Tutorial.Oder schau dir hier im Forum ein paar andere Beiträge an.
-
#include <stdio.h> #include <string.h> int main(void) { char password[5]; scanf("%4s", password); if (strcmp(password, "test") == 0) .. }
Du brauchst 5 Felder, weil C-Strings mit einer 0 abgeschlossen werden. Also "test" wird zu 't' 'e' 's' 't' '\0'.
Du kannst nicht if (password == "test") nutzen, weil die Pointer verglichen werden.
Du solltest bei scanf() die maximale Länge die eingelesen werden soll mit angeben, sonst kann ein Nutzer über die Arraygrenzen hinausschreiben.
-
@Argh ich besuche ne Programmierschule.. bin 15 Jahre alt und möchte lediglich herumexperimentieren ^^
wir sind grad mal bei den Schleifen.. is mir zu langweilig deswegen "rate ich mal in der Gegend rum"
Sry wenns dich stört@cooky451 Danke diggah! Jez versteh ichs
MfG, meldinoooooo!
-
Sein Code hätte unter Umständen funktionieren können, wenn er das abschließende NULL-Zeichen mit eingekalkuliert hätte, denn die meisten Compiler legen identische Strings nur einmal an und da könnte ein Pointervergleich tatsächlich das gewünschte Resultat liefern. Würde aber wohl auch nur dann funktionieren, wenn die beiden Variablen im selben Gültigkeitsbereich deklariert werden. D. h. eine globale "Hallo"-Variable und eine lokale Variante davon, würde wahrscheinlich nicht mehr das gewünschte Ergebnis liefern. Oder sehe ich das falsch?
L. G.
Steffo
-
Steffo schrieb:
Sein Code hätte unter Umständen funktionieren können, wenn er das abschließende NULL-Zeichen mit eingekalkuliert hätte, denn die meisten Compiler legen identische Strings nur einmal an und da könnte ein Pointervergleich tatsächlich das gewünschte Resultat liefern. Würde aber wohl auch nur dann funktionieren, wenn die beiden Variablen im selben Gültigkeitsbereich deklariert werden. D. h. eine globale "Hallo"-Variable und eine lokale Variante davon, würde wahrscheinlich nicht mehr das gewünschte Ergebnis liefern. Oder sehe ich das falsch?
Dann muss der Compiler aber wissen, das der User "test" eingibt, damit er
char password[5];
und das Stringliteral"test"
auf die selbe Adresse legen kann.char password[5]
; ist ein Speicherbereich auf dem Stack.
"test"
kann irgendwo (ROM, Programmspeicher, Datenspeicher) sein, nur nicht an der Stelle von password.Nebenbei steht NULL für den Zeiger auf einen ungültigen Wert.
-
Argh schrieb:
Wenn du C lernen willst dann rate nicht in der Gegend rum sondern lies ein Buch von vorne durch. In diesem Fall genügt auch ein drittklassiges Online-Tutorial.
NEIN, selbst probieren ist auch ein guter Ansatz zum Lernen und schafft gerade für Anfänger jede Menge Motivation. Man soll niemand eine bestimmte Lernmethode aufzwingen!
Wir sind hier im Forum auch für einfache Fragen zuständig. Ein Rüffel wegen fehlender Kenntnisse oder der Verweis auf das Lesen von Büchern oder Tutorials erscheint mir unangemessen - die sind oft auch nicht das Gelbe vom Ei!
Vorschlag: Deklariere den Passwortstring ausreichend oder üppig gross mit z.B. char passwort[64]. Dann siehst du dir die Funktion strcmp() an oder gehst zum weiteren Lernen selbst an die einzelnen Zeichen der zu vergleichenden Strings ran. Und wenn du nicht weiter kommst, frage möglichst präzise neu!
-
prima, Bernie
Was mir persönlich beim Verständnis der "Grundfunktionen", gerade für String-Verarbeitung, weiterhalf: Die Funktionen bezüglich Verwendung und Ergebnis kennen, danach versuchen, im Einfachen nachzubauen und von jemandem mit etwas Ahnung von der Materie durchsehen lassen.
Sicherlich wirst Du beim Nachbauen so manche mehr oder weniger wichtige Prüfung in der Funktion weglassen oder übersehen, aber das wird Dir womöglich helfen, ein Gefühl für die Sprache zu bekommen.