C
Gott muss mir langweilig sein..
Naja also irgendwo hatte ich so was noch rumfliegen und da habe ich es eben umgeschrieben.
Ich hoffe Dir wird vor allem der Umgang mit getch(); etwas klarer. Denn das Anlegen von 5 char Variablen scheint hier nicht wirklich praktikabel
Dass das Ganze natürlich überhaupt nicht sicher ist sollte klar sein, aber ist ja wahrscheinlich auch nur eine Übung.
Hoffe da ist nicht zu viel "Wirwar" in einem so alten Code, habe aber alles mal durchkommentiert^^
#include <conio.h>
#include <stdio.h>
#include <string.h>
#define PASSWORD "51917"
int main()
{
int i; // laufvariable
char buffer[0x100], username[0x100]; // zwei char arrays mit 256 Feldern
FILE *file; // ein file-pointer
file = fopen("username.txt", "r"); // datei username.txt zum lesen ("r" = read) öffnen. fopen gibt einen pointer auf die datei zurück
if (!file) // falls die datei nicht geöffnet werden kann gibt fopen 0 zurück (bzw. pointer auf 0)
{
printf("could not open username.txt\n");
return 1;
}
if (!fgets(username, sizeof(username), file)) // fgets liest eine zeile aus file. kann nichts gelesen werden wird 0 zurück gegeben
{
printf("could not read username\n");
return 2;
}
if (username[strlen(username) - 1] == '\n') // fgets liest eventuelles '\n' mit ein, dieses muss entfernt werden
{
username[strlen(username) - 1] = 0;
}
printf("login as: ");
fgets(buffer, sizeof(buffer), stdin); // fgets funktioniert natürlich auch auf stdin ;) (konsole)
buffer[strlen(buffer) - 1] = 0; // hier wird sehr sicher das '\n' eingelesen, daher keine abfrage
if (strcmp(username, buffer) != 0) // username (aus datei) und buffer (aus eingabe) werden verglichen
{ // strcmp() gibt 0 zurück falls die strings gleich sind. daher auf != 0 prüfen.
printf("invalid username\n"); // if(strcmp()) ginge auch, allerdings könnte das zu missverständnissen führen.
return 3;
}
memset(buffer, 0, sizeof(buffer)); // buffer wird mit 0 überschrieben (damit wir buffer noch einmal nutzen können)
printf("password: ");
for (i = 0; i < sizeof(buffer); i++)
{
buffer[i] = getch(); // buffer[i] liest ein neues zeichen ohne echo auf stdout ein. i ist immer kleiner < 256 (!)
if (buffer[i] == 0x08) // "löschen" zeichen muss selbst verarbeitet werden
{
buffer[i] = 0; // buffer[i--] = 0;
buffer[i - 1] = 0; // buffer[i--] = 0;
i -= 2; // ginge auch, ist so aber vielleicht besser verständlich
}
if (buffer[i] == '\r') // "enter" muss auch verarbeitet werden. bedenke dass windows hier '\r' sendet
{
printf("\n"); // also müssen wir den zeilenumbruch selbst ausgeben
buffer[i] = 0; // da das '\r' nicht zum string gehoert
break;
}
if (buffer[i] == 0x03) // strg+c (abbrechen von programmen in der konsole) kann man auch noch berücksichtigen
{
return -1;
}
}
if (strcmp(PASSWORD, buffer) != 0) // PASSWORD (siehe #define) und buffer (aus eingabe) werden verglichen
{
printf("invalid password\n");
return 4;
}
printf("login successful\n"); // ist kein fehler aufgetreten ist der nutzer angemeldet
printf("root@root#"); // ..
return 0;
}
siehe auch:
http://www.cplusplus.com/reference/clibrary/cstdio/
http://www.cplusplus.com/reference/clibrary/cstdlib/
http://www.cplusplus.com/reference/clibrary/cstring/