Code:Passworteingabe in einer Win32Console
-
VString bietet meist das ,was oft zum Problem wird.
Automatische Typenumwandlung.
Außerdem werden viele Operatoren überladen, die doch das Leben z.b. bei cin und cout sehr vereinfachen :hier die definition:
http://spotlight.de/zforen/cpp/m/cpp-1060116715-15802.htmlVDialog ist eigentlich nur dazu gedacht,
schnell ein Dialog zu erstellen, und auf Nachrichten zu reagieren.
Man muss dazu nicht VDialog überschreiben, sondern ein EventHandler Objekt, dass dann dem Dialog übergeben wird.
Man muss sich nicht mit der Winapi beschäftigen.Außerdem hat das alles einen großen Vorteil :
Es ist klein und kommt ohne jegliche DLLs aus!
-
Ich habe mal ein wenig korrigiert, damit die Fehlermeldungen aufhören und das überhaupt geht. So schluckt das auch der Dev-C++:
#include <iostream> #include <string> #include <conio.h> using namespace std; string read_password ( int maxlength ) { string pw ( "" ); char now ( '\0' ); while ( ( maxlength-- > -1 ) && ( now != 13 ) && ( now != 10 ) ) { // Zeichen einlesen now = getch (); // Bei Sonderzeichen zweites Zeichen ignorieren if ( now == 0 || now == 0xE0 ) // 0xE0 = 224 { getch (); } // Backspace abfangen else if ( now == '\b' ) { pw.erase ( pw.end()-1 ); cout << "\b \b"; maxlength+=2; } // Wenn Zeichen normal dann an das Passwort anhängen if( (now == 13) || (now == 8) ) { } else { pw = pw + now; cout << '*'; } } return ( pw ); } int main() { cout << "Passwort eingeben: "; string pw = read_password(5); if (pw == "Hal?o") cout << "\no.k." << endl; else cout << "\nfalsches Passwort" << endl; getch(); }
Ist aber noch nicht völlig in Ordnung, z.B. Backspaces über Anfang hinaus, kann man aber mit leben.
-
Hallo ! der code is super nur kann man nicht die BACKSPACE taste benützen.. also man kann es schon und er reagiert auch auf dei BACKSPACE taste nur zeig er das nicht an .. er zeigt noch eine gedrückte taste an.
Bsp.:
ich gebe ein abcd[BACKSPACE]
BILDSCHIRM: ***** //er macht noch ein Stern für BACKSPACE statt eins zu löschen
Aber wenn ich das PW ausgebe kommt das richtige raus:
BILDSCHIRM: abckannst du bitte den code noch so verbessern das er ein sternchen löscht statt eins dazu zu machen .... pls.! DANKE!
-
Also meine nachricht war an Dezipaitor und gemeint habe ich den CODE den er ganz am Anfang geschrieben hat!
-
Warum nimmst Du nicht den einfacheren Code?
-
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