Proste haslo w c++

0

Czesc. Probuje napisac prostego if'a jako haslo do programu z pewnym 'udoskonaleniem' - pojawiajacymi sie gwiazdkami przy wpisywaniu hasla. Moze ktos pomoc i powiedziec co robie nie tak? Z gory dzieki.



string haslo;
    char znak;
    int i;
 
    cout<<"podaj haslo: ";
    cin>>haslo;
 
 
    for (i=0; (znak=getch())!='\r'; i++)
    {
        cout <<'*';
        haslo[i]=znak;
    }
 
 
    if (haslo!="admin")
        cout<<"blende haslo"<<endl;
    else
        cout<<"haslo ok";

 
5

Poza smrodkiem przy inkrementacji: http://4programmers.net/Forum/1101404
oraz polskim nazewnictwem: http://4programmers.net/Forum/1208091
to tylko cin>>haslo; wadzi oraz haslo+=znak; by się przydało.
Poza tym: http://stackoverflow.com/questions/1413445/read-a-password-from-stdcin

0

Zmienilem 'cin-a' na 'getline(cin, haslo);' i postinkr. na preinkr., ale nadal nie działa.

1

Zwyczajnie wywal to.

0

Śmiga aż miło. Wielkie dzięki! :)

0

Chcialbym jeszcze dodac 'blokowanie' dostepu po 3 nieudanych probach wpisania hasla. Chcialbym po tym 30 sekundach powrocic do poczatku logowania, aby rozpoczac je od nowa. 'goto' wypada z gry. Jakies propozycje?

int main()
{

    string haslo;
    char znak;
    int bledy=0;

    while(haslo!="admin" && bledy<3)

    {
        cout<<"podaj haslo: ";

        for (int i=0; (znak=getch())!='\r'; ++i)
        {
            cout <<'*';
            haslo[i]=znak;
            haslo+=znak;
        }

        if (haslo!="admin" && bledy<3)
        {
            ++bledy;
            cout<<endl<<"Blende haslo. Pozostala liczba prob: "<<3-bledy<<endl<<endl;
        }

        if (haslo!="admin" && bledy==3)
        {
            cout<<"Wpisales 3 razy bledne haslo. Dostep zostal zablokowany na 30 sekund."<<endl;
            Sleep(4000);
            for (int i=30; i>=0; --i)
            {
                system("cls");
                cout<<i;
                Sleep(1000);
            }
        }
        if (haslo=="admin")
            cout<<endl<<"haslo ok";
    }
}
 
2

Bo działa to tak:

  1. Wpisujesz złe hasło -> przed ifem bledy = 0, wchodzisz do if'a, po wyjściu bledy = 1
  2. Sprawdzasz warunek while - OK.
  3. Wpisujesz złe hasło -> przed ifem bledy = 1, wchodzisz do if'a, po wyjściu bledy = 2
  4. Sprawdzasz warunek while - OK.
  5. Wpisujesz złe hasło -> przed ifem bledy = 2, wchodzisz do if'a, po wyjściu bledy = 3
  6. Sprawdzasz warunek while - NIE SPEŁNIONY!

Jeśli wejdziesz do if'a i zmienisz bledy na 3 to pamiętaj, że nie wejdziesz potem do else if - a chyba tak byś chciał.

1

Jeżeli nie zależy Ci specjalnie na przenośności kodu to możesz skorzystać z conio.h i zrobić tak:

#include<iostream>
#include<conio.h>
using namespace std;

int main() {
	string password = "";
	string correctPassword = "admin";

	unsigned tries = 3;
	char character = ' ';

	do {
		cout << "Enter password: ";
		while ((character = _getch()) != '\r') {
			cout << "*";
			password += character;
		}

		if (password != correctPassword) {
			password = "";
			tries -= 1;
			cout << "\nTries remaining: " << tries << endl;
		}
	} while (tries > 0 && password != correctPassword);

	if (tries == 0) cout << "\nUser blocked!\n";
	else cout << "\nPassword correct!\n";

	return 0;
}

PS: Unikaj magic-stringów typu haslo != "admin" etc... Wrzucaj takie wartości do zmiennych, bo później zamiast w jednym miejscu programu będziesz musiał latać po całym kodzie kiedy nadejdzie potrzeba zmiany warunku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1