invisiblekid Temat założony przez niniejszego użytkownika |
program- hasło » 2009-02-12 20:56:36 mam pytanko w jaki sposób pobrac z klawiatury wyraz ale w taki sposób, żeby każda litera była zapisywana jako gwiazdka "*" (czyli inaczej mowiąc aby to bylo wprowadzanie hasła, którego postronni nie powinni zobaczyc). Napisałem taki program ze złudną nadzieją, że po wprowadzeniu char'a nie trzeba tego potwierdzac enterem- a jednak trzeba wiec program raczej nie dzila tak jak powinien :/ #include <iostream> #include <cstring> #include "materialy/console.ddt"
using namespace std; using namespace ddt::console;
int main() { char a; string pass; for( int i = 0; i < 9; i++ ) { clrscr(); cout << "Password: "; for( int j = 0; j < i; j++ ) cout << "*"; cin >> a; pass =+ a; } textcolor( 12 ); if( pass == "cplusplus" ) cout << endl << "password accepted!"; else cout << endl << "password denided!"; cin >> a; getchar(); } z góry dzięki :D a tak swoją drogą jak rozwikłacie ten problem to czy moglibyście mi powiedzieć dlaczego pass nie równa sie "cplusplus" nawet gdy to wprowadzę (czy to moze wynik tego zapisu "pass=+a"- moze należało wczesniej wykonać rzutowanie?) Pozdrawiam |
|
DejaVu |
» 2009-02-12 22:32:18 Problem z hasłem: Zapis: pass = + a; zamień na: pass += a; lub na: pass = pass + a; co do gwiazdek zamiast znaków... opcja 1) nie wyświetlać wprowadzanych znaków - przekierować standardowy strumień wejścia z konsoli na coś innego. opcja 2) napisać sobie za pomocą getch() funkcję do wczytywania tekstu i nie wypisywać znaków - czyli np. coś takiego: int znak; std::string tekst; do { znak = getch(); tekst +=( char ) znak; } while( znak != 13 ); Do tego oprogramować musisz jeszcze backspace. |
|
invisiblekid Temat założony przez niniejszego użytkownika |
» 2009-02-14 16:10:41 thanx a lot! sorry za ten błąd z kolejnością "+=" :P a tak swoją drogą nie do końca rozumiem opcję nr 1 (a konkretnie to sformułowanie "przekierować standardowy strumień wejścia z konsoli na coś innego."). Jak widzicie po błędach jestem dość początkującym "zawodnikiem" wiec nie całkiem to pojmuje. a opcję nr 2 staram się wprowadzic w życie :D |
|
DejaVu |
» 2009-02-14 18:23:01 Wiem, że tą opcję nr 1. da się zrobić, ale nie chce mi się szukać jak :) Gdzieś na forum temat był już poruszony dla standardowego wyścia - może znajdzie się jakaś analogia w obu tych tematach. |
|
invisiblekid Temat założony przez niniejszego użytkownika |
» 2009-02-15 20:57:17 goddamned! zrobilem program wg. opcji 2 i cos sie psuje. :/ konkretnie instrukcja sprawdzająca poprawność hasła sie spsuła. oto program, może ktoś coś zauważy: #include <iostream> #include <conio.h> #include "materialy/console.ddt"
using namespace std; using namespace ddt::console;
int main() { int a; string pass; int i = 0; cout << "Password: "; do { if( i != 0 ) cout << "*"; a = getch(); pass +=( char ) a; i++; } while( a != 13 ); cout << endl << pass << "."; textcolor( 12 ); if( pass == "." ) cout << endl << "password accepted!"; else cout << endl << "password denied!"; cin >> a; getchar(); } Ja zauważyłem fakt że z hasłem dzieje sie coś dziwnego nawet po pętli je pobierającej. Jeśli wyświetlamy hasło a po nim dajemy jakiś znak (czy cokolwiek) to ten znak (czy owo cokolwiek) wędruje na pierwsze miejsce. Nie że dziwne? Widać to w zapisie: cout << endl << pass << "."; Czekam cierpliwie na nastepne spostrzeżenia, a nawet na odpowiedź :D |
|
DejaVu |
» 2009-02-15 23:56:11 pass +=( char ) a; zamień na: if( a >= 32 ) pass +=( char ) a; |
|
invisiblekid Temat założony przez niniejszego użytkownika |
» 2009-02-17 17:53:20 Program po poprawkach działał jak należy, ale jak brałem się do modyfikacji to się spsuł. Chciałem go poprawić o warunek dla backspac'a ale coś nie dziła. Oto program: #include <iostream> #include <conio.h> #include "materialy/console.ddt"
using namespace std; using namespace ddt::console;
int main() { int a; string pass; int i = 0; do { clrscr(); cout << "Password: "; for( int j = 0; j < i; j++ ) cout << "*"; a = getch(); if( a == 8 ) { pass[ i - 1 ] = 0; i--; } else; if( a >= 32 ) { pass[ i ] =( char ) a; i++; } } while( a != 13 ); cout << endl << "wypisales: "; for( int j = 0; j < i; j++ ) cout << pass[ j ]; cout << endl << "wypisales: " << pass; textcolor( 12 ); if( pass == "cplusplus" ) cout << endl << "password accepted!"; else cout << endl << "password denied!"; cin >> a; getchar(); }
Wątpilwości mam do linijki pass[ i ] =( char ) a; bo gdy zastąpić ja pass +=( char ) a; to program działa normalnie (pod warunkiem, że nie wciśniemy backspac'a- wtedy we wprowadzonym haśle będzie spacja) Z kolej gdy uruchomimy program w takim wyglądzie jak wyżej to, co prawda, wyświetlając po jednym elemencie ciągu hasło jest jakie być powinno, ale gdy patrzymy na wynik linijki "cout<<pass;" to nie widzimy nic. Od czego to zależy (napiszcie jak wiecie bo chce się również czegoś dowiedzieć o stringach- jak widać mam pewne braki bo większość moich zapytań wynika własnie z tej nieznajomości). Dzięki z góry i pozdrawiam :D |
|
DejaVu |
» 2009-02-17 20:05:51 Wykonując zapis: pass +=( char ) a; wykonujesz w rzeczywistości operator += klasy std::string. Operator ten realokuje pamięć (jeśli zajdzie potrzeba) i dopisuje znak w utworzone miejsce. Z kolei operacja: pass[ i ] =( char ) a; w rzeczywistości wykonuje operator [] klasy std::string. Operator ten daje dostęp do danych, jednak nie zajmuje się ewentualną realokacją pamięci, przez co modyfikowanie wartości tą techniką jest błędne. Można zmieniać wartość w ten sposób pod warunkiem, że na 100% wiesz, że wartość taka istnieje. |
|
« 1 » 2 |