Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c++] maskowanie wpisywanego hasła

niemamkolan 19 Mar 2010 08:45 4086 9
  • #1 19 Mar 2010 08:45
    niemamkolan
    Poziom 8  

    witam mam taki kod

    Code:
        string haslo;
    
        haslo='1234';
        cout<<"Podaj haslo: ";
        for(;haslo!="1234";)
        {cin>>haslo;
        if(haslo!="1234")
        cout<<"Haslo nieprawidlowe..."<<endl<<"Podaj haslo: ";
        else system("cls");
       }


    i chcę żeby przy wpisywaniu hasła były gwiazdki

    z góry thx za pomoc

    0 9
  • #3 19 Mar 2010 21:39
    niemamkolan
    Poziom 8  

    a coś więcej?

    0
  • #5 22 Mar 2010 12:37
    ed-ek
    Poziom 34  

    Dżyszla napisał:
    1. Czytaj znak
    2. Jeśli ENTER - przejdź do 6
    3. Wyświetl gwiazdkę.
    4. Dopisz znak do ciągu
    5. Idź do 1.
    6. Porównaj hasło.

    Chyba nawiązujesz do swego poprzedniego postu aby to robić z wykorzystaniem fcji getch(). Niby wszystko w porządku, ale po wczytaniu znaku np: ch=getch(); jak opróżnisz bufor klawiatury aby wczytać następny znak? Rozwiń swoją myśl bo bardzo mnie to interesuje.

    0
  • #7 22 Mar 2010 18:14
    akaz_
    Poziom 12  

    Jeśli nie koniecznie muszą to być gwiazdki, a chcesz jedynie nie wyświetlać hasła,
    użyj char *getpass(const char *prompt) z unistd.

    Przykładowe użycie:

    Code:

    #include <unistd.h>
    #include <stdio.h>

    void main() {
        char *haslo = getpass("Podaj haslo: ");
        printf("%s", haslo);
    }


    Co prawda to jest C, ale nie będziesz miał raczej z tym problemu,
    do porównywania możesz użyć int strcmp( const char * str1, const char * str2 ) (zwraca 0 gdy się zgadzają).


    Jeżeli bardzo zależy Ci na gwiazdkach, pod uniksami możesz to zrobić wyłączając
    buforowanie terminala za pomocą int tcsetattr(int fd, int optional_actions, struct termios *termios_p) z termios:

    Code:

        struct termios stary, nowy;

        tcgetattr( STDIN_FILENO, &stary );  // pobierz aktualne parametry
        nowy = stary;
        nowy.c_lflag &= ~( ICANON | ECHO );  //wylacz buforowanie oraz wyswietlanie wpisywanych znakow
        tcsetattr( STDIN_FILENO, TCSANOW, &nowy ); //ustaw wyzej podane parametry
        /* kod od wczytywania */
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); //przywroc stare parametry
        /* reszta */

    0
  • #8 22 Mar 2010 18:24
    Dariusz Bismor
    Poziom 17  

    Niestety, sprawa nie jest prosta i nie należy do zagadnień związanych z językiem C++ czy nawet C. Wspomniana funkcja getch() nie należy do standardu języka C++ ani C. Pod *nixem jest dostępna w bibliotece ncurses. Jeżeli piszesz dla terminala kompatybilnego z vt100, to pod tym adresem znajdziesz sposób wyłączenia echa, który będzie efektywny przy każdym odczycie, także za pomocą cin:
    http://forums11.itrc.hp.com/service/forums/qu...447626+1269278562197+28353475&threadId=380786

    HTH,
    Dariusz

    0
  • #9 22 Mar 2010 18:44
    akaz_
    Poziom 12  

    Dariusz, nigdzie nie użyłem getch(), a z C chodziło mi o wykorzystanie char* zamiast używanego w CPP stringa.
    Przykład z linku, który podałeś, jest identyczny z podanym moim przykładem (tcsetattr z termios).
    Swoją drogą, w termios znajduje się również getchar(), więc nie trzeba dodatkowo wykorzystywać ncurses.

    0
  • #10 23 Mar 2010 19:34
    Dariusz Bismor
    Poziom 17  

    akaz_, moja odpowiedź była nie do Twojego postu, ale do jednego wcześniej. Kiedy ją zacząłem pisać, Twojego postu jeszcze nie było. Faktycznie, Twój opis jest bardziej kompletny. Nie zmienia to jednak faktu, że ani w specyfikacji C, ani w specyfikacji C++ nie ma mechanizmów pozwalających uzyskać efekt braku echa.

    Dariusz

    0