passwort und sternchen



  • Hallo liebe forumsgemeinde
    Vorweg:
    Ich habe mich durch das forum durchgelesen, habe auch 2 codebeispiele versucht zu anwenden. Das problem ist folgendes:
    Die getchfunktion will bei mir nicht so funktionieren. Kennt jemand eine andere möglichkeit, um bei der eingabe statt das klare zu sehen, nur ein sternchen zu sehen? Quasi wie eine normale passwortabfrage.

    code:
    void neuerNutzer() {
    string benutzername, passwort;
    cout << "Gebe bitte deinen gewünschten Benutzernamen ein" << endl;
    cin >> benutzername;
    cout << "Gebe dein Passwort ein" << endl;
    cin >> passwort;
    }

    hat jemand eine idee? Wäre euch echt dankbar.
    Ich bin ein c++ anfänger, mit soliden kenntnissen, weiss nicht so recht, wo ich mich einordnen soll, da gibt’s tage, wo ich denke, ich bin das grösste idiot auf erden, dann andere, wo ich von mir begeistert bin :D.
    Btw nicht vergessen:
    Ich habe die links in diesem forum angeschaut, die getchfunktion will wirklich bei mir nicht gehen. Wenn ich die getchfunktion verwende, komme ich gar nicht in die funktion bzw. gar nicht in die schleife, die für dieses unterfangen benötigt wird.
    Gibt es also eine andere möglichkeit, ausser getch.
    Oftopick:
    Meiner meinung nach, ist das ein unding, dass es für c++ keine funktion gibt, die das erfüllt.
    Danke für eure antwort.





  • Das müsste eigentlich sogar mit Standard C++ gehen.
    Mit cin.tie() kann man den Outputstream setzen.
    Der muss dann lediglich einen streambuf haben, der für jedes Zeichen ein '*' ausgibt. So genau kenne ich mich damit auch nicht aus, aber es sollte klappen.

    Edit: Oh, sorry. Anfänger.


  • Mod

    Nathan schrieb:

    Das müsste eigentlich sogar mit Standard C++ gehen.
    Mit cin.tie() kann man den Outputstream setzen.
    Der muss dann lediglich einen streambuf haben, der für jedes Zeichen ein '*' ausgibt. So genau kenne ich mich damit auch nicht aus, aber es sollte klappen.

    Edit: Oh, sorry. Anfänger.

    Egal ob Anfänger oder nicht, ist die Idee totaler Quatsch. Soll ich das erläutern oder siehst du selber, wo es hackt? Probier's mal einfach aus.



  • 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