passwort und sternchen



  • Ich machs mal selber.



  • s33af schrieb:

    http://msdn.microsoft.com/en-us/library/kswce429.aspx

    Sorry, ich wollte _getch verlinken 🙄
    http://msdn.microsoft.com/de-de/library/ms235446(v=vs.110).aspx
    Wenn du unter Linux oder einem anderen OS als Windows programmierst, dann gibts äquivalente Funktionen, die dasselbe wie getch machen.

    #include <stdio.h>
    #include <conio.h>
    
    void password_input(char* buf, int bufsize)
    {
    	int i = 0;
    	while ( i < bufsize-1 )
    	{
    		int c = _getch();
    		if ( c == 13 ) // Wurde Enter gedrückt?
    		{
    			break; // Jepp.
    		}
    		else
    		{
    			buf[i++] = c;
    			putchar('*');
    		}
    	}
    	buf[i] = 0;
    }
    
    int main(void)
    {
    	char buf[256]={0};
    	printf("%s", "Type your password and hit enter: ");
    	password_input(buf, sizeof(buf));
    	puts(buf);
    	return 0;
    }
    

    Das sollte sich leicht in C++ umschreiben lassen.





  • Hatte bisher keine Zeit.
    Warum ist sputc() nicht virtual oder bzw. warum called sputc() nicht eine protected virtual function, wie alle anderen auch?
    So geht das dann nicht.
    Komposition geht auch nicht, wegen Vererbungshierachie.
    imo ist das ein Desingfehler.



  • Nathan schrieb:

    Warum ist sputc() nicht virtual oder bzw. warum called sputc() nicht eine protected virtual function, wie alle anderen auch?

    Schon overflow gesehen? http://en.cppreference.com/w/cpp/io/basic_streambuf/overflow

    Nathan schrieb:

    So geht das dann nicht.

    Ja, aber das ist ein anderes Thema.

    Nathan schrieb:

    Komposition geht auch nicht, wegen Vererbungshierachie.

    Ja, die Komposition hat ein paar Missklänge.

    Nathan schrieb:

    imo ist das ein Desingfehler.

    Mach du erst einmal an deinem weiter.


  • Mod

    Nathan schrieb:

    Hatte bisher keine Zeit.
    Warum ist sputc() nicht virtual oder bzw. warum called sputc() nicht eine protected virtual function, wie alle anderen auch?
    So geht das dann nicht.
    Komposition geht auch nicht, wegen Vererbungshierachie.
    imo ist das ein Desingfehler.

    Nein, du hast das einfach falsch verstanden. Die Eingabe ist schon laaaaaange gelaufen, wenn die Streams drankommen. Komplett falscher Ansatz. Das ist als wollte man einen Baum fällen, indem man ihn auf einem Foto weg retuschiert.

    Das tie() macht auch ganz was anderes, als du denkst. Das der ge-tie-te Stream wird vor Eingaben geflusht. Das ist alles, wozu tie gut ist. Das ist damit man nicht ständig

    cout << "Eingabe: " << flush;
    cin >> eingabe;
    

    schreiben muss, um sicher zu sein, dass die Frage erscheint, bevor die Leseaktion stattfindet.

    Aber was heißt hier schon Leseaktion? Es ist schließlich nicht so, dass das cin-Objekt irgendwie die Tastatur auslesen würde. Es werden bloß Zeichen aus dem stdin-Stream verarbeitet. Die können da vorher oder auch nachher irgendwie reinkommen. Wie kommen sie darein? Das hat mit deinem Programm überhaupt gar nichts zu tun. Das macht irgendeine Ebene der Programmumgebung, zum Beispiel der Terminalemulator, wenn das Programm in einem Terminal läuft. Woher bekommt der die Zeichen? Er liest die auch nicht selber ein, sondern bekommt sie vom Eingabesubsystem der grafischen Umgebung. Und so weiter.

    Wenn du also verhindern willst, dass eingetippte Zeichen auf dem Bildschirm erscheinen, dann ist ein C++-Stream die falsche Adresse dafür. Man muss sich an den wenden, der die Zeichen auf den Bildschirm schreibt. Hier zum Beispiel das Terminal.



  • Ich habe die Funktion tie() falsch verstanden, ich dachte, sie gibt den output stream an, auf dem man die eingabe sieht, dabei wirkt sie nur ein paralleles flush.
    Das dämliche dabei ist jedoch, dass ich den Fehler schon einmal falsch gemacht habe...

    Edit: Kam deinem Edit zuvor.



  • Nathan schrieb:

    Ich habe die Funktion tie() falsch verstanden, ich dachte, sie gibt den output stream an, auf dem man die eingabe sieht, dabei wirkt sie nur ein paralleles flush.

    Den Streambuf kannst du mit .rdbuf() angeben.



  • Ja, klar.
    Ich dachte aber, dass wäre der für die Ausgabe.



  • halllo leute
    wow, danke für euren antworten, da ist man mal einen tag weg und dann passiert so was, positive überraschung 😃
    s33:
    sorry, könntest du die codeabschnitte kommentieren?
    ich meine, das ist c und nicht c++, also macht so den anschein.
    noch was: für den fall, das ihr findet ich trage wenig zur problemlösung bei, folgender ansatz von mir, den ich implementiert habe.
    code:
    string benutzername;
    char passwort[20];
    cout << "Gebe bitte deinen gewünschten Benutzernamen ein" << endl;
    cin >> benutzername;
    cout << "Gebe dein Passwort ein" << endl;
    cin>> passwort;
    char t;
    int i=0;
    while((t = getch()) != 13)
    {
    cout<<"*";
    passwort[i++] =t;
    }
    }

    mit dem string ging das nicht, dann habe ich mal ein char genommen. leider will es immer noch nicht gehen, was meint ihr zu dieser lösung?
    lg



  • coleman schrieb:

    was meint ihr zu dieser lösung?

    kagge.
    SideWinder hat dir nen link mit ner c++ varainat gepostet, da gibbet kommentierten code, musste ma kuggn


Anmelden zum Antworten