Code:Passworteingabe in einer Win32Console



  • 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 geschafft 😞

    wie 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.





  • 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



  • @Sidewinner :
    Dummerweise war mein geposteter Code ein BUGFIX und keine Wiederholung.
    Es ist klar dass eine Wiederholung blödsinn ist,
    aber denke doch 2-mal darüber nach, bevor du ein BUGFIX-Code löscht.
    Das ist nur zum nachteil aller. Am Ende kriege ich wieder Mail, dass ich den Bug doch beseitigen solle - und ich frage mich warum, da doch das schon geschehen ist.
    Genausowenig werde ich schreiben, dass der Progger doch an der Stelle x den Code y einfügen soll, und an der Stelle z den Code p löschen muss. Dann poste ich doch gleich den Code.

    ->Stattdessen hättest du auch die ersten Codes löschen können.

    Deshalb hier nochmals das BUGFIX zum letzten Mal :

    int ReadPasswordC(LPTSTR &szPassword,size_t &Length)
    {
    	DWORD dwOldMode;
        HANDLE m_STD_INPUT_HANDLE = GetStdHandle(STD_INPUT_HANDLE); 
        HANDLE m_STD_OUTPUT_HANDLE = GetStdHandle(STD_OUTPUT_HANDLE); 
    
    	GetConsoleMode(m_STD_INPUT_HANDLE,&dwOldMode);  
    
    	SetConsoleMode(m_STD_INPUT_HANDLE,0);
    
    	unsigned char c;
    
    	char PassChar = '*';
    	DWORD w;
    	int i = 0;
    
    	memset(szPassword,0,Length);
    	do
    	{
    		c = '\0';
    
    		if (!ReadConsole(m_STD_INPUT_HANDLE,&c,1,&w,NULL)) break;
    		if ((i < Length) && (c != '\n') && (c != '\r') && (c != '\b'))
    		{
    			i++;
    			WriteConsole(m_STD_OUTPUT_HANDLE,&PassChar,1,&w,NULL);			
    			strncat(szPassword,(char*)&c,1);
    		}
    		if ((c == '\b') && (i > 0))
    		{
    			i--;
    
    			//Ermittelt die X-Position
    			CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
    			memset(&csbiInfo,0,sizeof(csbiInfo));
    			GetConsoleScreenBufferInfo(m_STD_OUTPUT_HANDLE,&csbiInfo);
    
    			csbiInfo.dwCursorPosition.X--;
    			SetConsoleCursorPosition(m_STD_OUTPUT_HANDLE,csbiInfo.dwCursorPosition);
    
    			c = ' ';
    			WriteConsole(m_STD_OUTPUT_HANDLE,(char*)&c,1,&w,NULL);			
    
    			SetConsoleCursorPosition(m_STD_OUTPUT_HANDLE,csbiInfo.dwCursorPosition);
    			/*Dieser Code funktioniert nicht über das Zeilenende hinaus!*/
    
    			szPassword[i] = '\0';
    		}
    	}
    	while ((c != '\n') && (c != '\r'));
    
    	Length = strlen(szPassword);
    
    	SetConsoleMode(m_STD_INPUT_HANDLE,dwOldMode);
    	FlushConsoleInputBuffer(m_STD_INPUT_HANDLE);	
    
    	return 0;
    }
    


  • @Side
    😃 Was auch verständlich ist. Wenn ein Thread passt für die FAQ, dann kann man ihn ja auch lassen. Aber dieser Thread ist doch etwas undurchsichtig, darum bin ich auch ausnahmsweise dafür, dass du einen neuen machst.



  • Ich werde allerdings keine Low-Level-Lösung in der FAQ anbieten sondern meine High-Level-Lösung oder eine veränderte Variante von Dezipaitor. Die sollen nicht den gleichen Unfug treiben :).

    MfG SideWinder



  • Ich hoffe du vergisst auch meine Lösung nicht :p



  • Ich finde man sollte alle Lösungen in die FAQ stellen,
    und der Leser entscheidet, welche zu ihm besser passt.



  • Dezipaitor schrieb:

    Ich finde man sollte alle Lösungen in die FAQ stellen,
    und der Leser entscheidet, welche zu ihm besser passt.

    Nenne mir Vorteile einer Lösung in der man das Rad (getch) neu erfindet.

    MfG SideWinder



  • !der Leser entscheidet, welche zu ihm besser passt.!


Anmelden zum Antworten