Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

program- hasło

Ostatnio zmodyfikowano 2009-02-18 16:02
Autor Wiadomość
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 :/
C/C++
#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
P-4230
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:
C/C++
int znak;
std::string tekst;
do
{
    znak = getch();
    tekst +=( char ) znak;
} while( znak != 13 );
Do tego oprogramować musisz jeszcze backspace.
P-4232
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
P-4240
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.
P-4241
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:
C/C++
#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
 

P-4253
DejaVu
» 2009-02-15 23:56:11
pass +=( char ) a;
zamień na:

if( a >= 32 ) pass +=( char ) a;
P-4257
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:
C/C++
#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 ) { //warunek dla BACKSPACE
            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

P-4276
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.
P-4278
« 1 » 2
  Strona 1 z 2 Następna strona