Code:Passworteingabe in einer Win32Console
-
ich finde, bei den vielen passwortfragen könnte dezipaitors code in die faq für konsole mit winapi möglichkeit (windows.h) und für die dos und djgpp leute kann was daneben gestellt werden.
-
So, hier meine Version für ANSI-C
char *read_password(char *password, int maxlength, char passchar) { char *pos=password; char now=0; //Solange die Taste Return nicht gedrückt wurde //und solange die maximale Anzahl an Zeichen nicht erreicht wurde while(now!=13 && now!=10 && pos-password<maxlength) { // Zeichen einlesen now=getch(); // Bei Sondertaste zweites Zeichen ignorieren if(now==0 || now==0xE0) // 0xE0 = 224 { getch(); continue; // Nächstes Zeichen einlesen } else if(now==8) //Wenn Backspace gedrückt wurde { if(pos>password) //Nur wenn schon ein Zeichen da ist! { *--pos=0; //Zuletzt eingegebenes Zeichen löschen printf("\b \b"); //Bildschirmausgabe korrigieren } } // Wenn eingelesenes Zeichen kein Steuerzeichen ist if(now>31) { *pos++=now; //Zeichen speichern putch(passchar); //Passwortzeichen ausgeben } } return(password); //Passwort zurückgeben }
Edit: Schönheitskorrekturen
-
Hey AJ supa cool bitte schreib auch eine main dazu wie man die Fkt. aufruft bitte!!!! -> Bin Anfänger! DANKE!
-
Das Backspace war garnicht vorgesehen.
Deshalb hier die Erweiterte Variante.
Allerdings funktioniert das Backspace nicht über das horizontale Zeilenende hinaus. Sobald der Cursor darüber hinaus geht, kann er nicht mehr zurück (der interne Zeichenpuffer wird trotzdem geändert)
Außerdem wird jetzt nicht mehr abgebrochen, wenn die maximale Anzahl von Zeichen erreicht wurde - in diesem Fall kann man einfach nicht mehr weiterschreiben -> Backspace geht allerdings schonCode
siehe weiter untenSobald ich es mal geschafft habe bei Sourceforge.net einen Account zu eröffnen.
Lade ich die erweiterte Konsolenklasse hoch
-
hi! @Dezipaitor
Du hast am anfang des codes etwas vergessen:HANDLE m_STD_INPUT_HANDLE = GetStdHandle(STD_INPUT_HANDLE); HANDLE m_STD_OUTPUT_HANDLE = GetStdHandle(STD_OUTPUT_HANDLE);
Aber sonst Funktionier alles einwandfrei! echt toll danke man!
-
@elise: Jetzt lass den Thread doch erstmal reifen :p
Standard C++ Variante:
@Erhard Henkes: Niemals Namespaces in eigenen Headern öffnen! Außerdem ist -1 ein Fehler gibt er 0 an wird die Schleife trotzdem einmal ausgeführt!
#include <iostream> #include <string> #include <conio.h> std::string read_pw ( unsigned short int Maxlength , char Ersatz = '*' ) { std::string pw ( "" ); char now ( '\0' ); while ( ( Maxlength-- > 0 ) && ( now != 13 ) && ( now != 10 ) ) { /* Zeichen einlesen */ now = getch (); /* Bei Sonderzeichen zweites Zeichen ignorieren */ if ( now == 0 || now == 0xE0 ) { getch (); } /* Backspace abfangen */ else if ( now == 8 ) { /* Wenn bereits Zeichen im String vorhanden sind */ if ( pw.length () = 0 ) { pw.erase ( pw.end() - 1 ); cout << "\b \b"; Maxlength += 2; } } /* Wenn Zeichen normal dann an das Passwort anhängen */ else if ( now != 13 ) { pw = pw + now; cout << Ersatz; } } return ( pw ); }
So final herausgebracht.
MfG SideWinder
-
habt ihr mal Umlaute getestet?
-
Dezipaitor schrieb:
habt ihr mal Umlaute getestet?
Nein was passiert dann?
MfG SideWinder
-
bei meinem code passiert nix,
solange die CodePage nicht auf Deutsch umgestellt wurde - Allerdings habe ich es noch nicht geschafftwie sieht es bei den anderen aus?
-
Kann sein, dass getch() Probleme macht mit den Umlauten. Das hatte ich auch schon mal bemerkt bei einem anderen Programm. Könnte daran liegen, dass getch() eigentlich nur für 16Bit Anwendungen gedacht ist. Umsonst steht in so manchen Hilfen nicht der Hinweis, dass man getch() nicht in 32Bit Anwendungen einbauen soll.
-
PS: @hobbyprogrammer
int main(void) { char passwort[10]; printf("Bitte Passwort eingeben: "); read_password(passwort, 8, '*'); putch('\n'); if(!strcmp(passwort, "willrein")) { printf("Passwort korrekt."); } else { printf("Falsches Passwort!"); } }
-
Bei Windows-Konsolen ist der Amerikanische Zeichensatz standard.
D.h. das Umlaute (öüä) nicht richtig dargestellt werden.ReadConsoleInput gibt in einem solchen Fall einen Charcode kleiner als 0 zurück (deshalb wird die Eingabe nicht im code angenommen).
Normalerweise kann man den Satz mit SetConsoleCP oder SetConsoleOutputCP umstellen - allerdings habe ich Zahlen zwischen 0 und 100.000 ausprobiert = ohne Erfolg.
-
siehe:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setconsolecp.aspIst zwar eigentlich für Java, aber könnte vielleicht weiterhelfen:
http://java.sun.com/j2se/1.3/docs/guide/intl/encoding.doc.html
-
Ich glaube die 850 ist die richtige Codepage - zumindest wird sie unter Win98 geladen.
Das mit <0 lässt sich leicht umgehen: macht mal aus dem char einen unsigned char!
MfG SideWinder
-
hui
das unsigned char ist die Lösung :
so kann man auch Umlaute verwenden (ohne Zusatz!!!!)EditBySideWinder: code gelöscht - man muss ihn nicht in jedem Posting anfügen
-
BTW: Eine möglichst High-Level-Funktion dafür nehmen. Also du musst das Rad (getch) in deiner Funktion nicht neu erfinden!
MfG SideWinder
-
Das finde ich aber garnicht net!
Wenn du den Code schon löscht, dann kannst du auch dafür sorge tragen, dass der erste Code entsprechende geändert wird.
Schließlich wird jemand, der kurz eine solche Funktion haben will, die erst beste nehmen, und nicht erst noch 50 Posts lesen, um festzustellen, dass er ein char in ein unsigned char ändern muss, damit auch Umlaute funktionieren.
(übrigens beginne ich selber in solchen fällen von hinten zu lesen, weil es am aktuellsten ist!)
Sollte das ein Misverständnis sein, dann nehme ich alles zurück und behaupte das Gegenteil.BTW. es ist zwar ganz toll, dass es High-Level Funktionen gibt, aber mir selbst ist es ein Grauß, c (getchar,putchar), c++ (cout, cin) und andere STL-Elemente gemischt in einen code unterzubringen. Ich habe mich definitiv für die Winapi, wegen ihrer größeren Flexibilität (Positionierung, Farbe usw) entschieden.
-
Dezipaitor schrieb:
Das finde ich aber garnicht net!
Wenn du den Code schon löscht, dann kannst du auch dafür sorge tragen, dass der erste Code entsprechende geändert wird.
Schließlich wird jemand, der kurz eine solche Funktion haben will, die erst beste nehmen, und nicht erst noch 50 Posts lesen, um festzustellen, dass er ein char in ein unsigned char ändern muss, damit auch Umlaute funktionieren.
(übrigens beginne ich selber in solchen fällen von hinten zu lesen, weil es am aktuellsten ist!)
Sollte das ein Misverständnis sein, dann nehme ich alles zurück und behaupte das Gegenteil.BTW. es ist zwar ganz toll, dass es High-Level Funktionen gibt, aber mir selbst ist es ein Grauß, c (getchar,putchar), c++ (cout, cin) und andere STL-Elemente gemischt in einen code unterzubringen. Ich habe mich definitiv für die Winapi, wegen ihrer größeren Flexibilität (Positionierung, Farbe usw) entschieden.
1. Ja sry, aber der Code stand pro Seite sicher schon 5 Mal.
2. Nein nicht alles mischen. Ich habe getch() und cout gemist - okay, aber wenns mit cin gegangen wäre hätte ich es gemacht. Aber wenn ich schon so Low-Level wie möglich sein will mach ich Assembler.
Also bitte nehmt immer das "höchste" was da ist. Man muss getch() nicht nochmals erfinden, die werden schon eine sehr optimierte Version programmiert haben!
MfG SideWinder
-
@Side
Wenn du vor hast diesen Thread in die FAQ zu stellen, dann würde ich vorschlagen, dass du einen neuen Thread dafür anlegst und jeweils die Endlösungen reinschreibst. Ansonsten kennt sich wohl kaum mehr einer aus, was nun das Endprodukt ist.
-
Ist eh meine Absicht, bloß sag ich das nicht weil ich sonst wieder eine von elise am Deckel krieg
MfG SideWinder