Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

czacha

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: czacha »

Czy ktos moglby mi pomoc napisac program pobierajacy od uzytkownika haslo i wyswietlajac gwiazdki?To moje dotychczasowe rezultaty:

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{
    int i = 0;
    char kod[i];
    char kod2[] = "marcin";
    char c;
    
    cout << "Podaj haslo: " << endl;

    while((c = getch()) != 13) // 13, to kod ENTERA, który kończy wpisywanie hasła
    {
        cout << "*";
        kod[i++] = c;//przypisuje pobrany znak c do tablicy i przechodzi do nastepnej litery
    }
    
    cout << "
Haslo: " << kod << endl;//wyswietla haslo
    cout << "Poprawne haslo: " << kod2 << endl;//wyswietla poprawne haslo
    
    //sprawdza poprawnosc hasla
    if (strcmp(kod,kod2) == 0)cout << "
Haslo jest poprawne
";
    else cout << "
Haslo jest bledne
";

    getch();//pobiera dowolny klawisz
    return 0;
}

Niewiem jak skorzystac z funkcji strcmp() oraz zauwazylem ze haslo podane rozni sie od pierwotnego. Prosze o jako takie wyjasnienie problemu i co bym musial poprawic
marshal
Użytkownik
Użytkownik
Posty: 1179
Rejestracja: 21 cze 2004, o 00:51
Płeć: Mężczyzna
Lokalizacja: krk
Pomógł: 9 razy

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: marshal »

Kod: Zaznacz cały

    int i = 0;
    char kod[i];
   

moze dlatego ze tablice 'kod' deklarujesz jako 0-elementowa. Nie jestem pewien czy w cpp tak mozna robic (tzn powiekszac rozmiar tablicy po zadeklarowaniu jakiegos).
bagin
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 18 paź 2006, o 19:49
Płeć: Mężczyzna
Lokalizacja: Częstochowa
Pomógł: 3 razy

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: bagin »

jeżeli chcesz robićto na char'ach to musisz nadać tablicy kod jakiś rozmiar ,bo nie możesz wrzucić nic do tablicy o zerowym rozmiarze(swoją drogą to dziwne, że system nie wywalił Ci żadnego błędu po uruchomieniu programu) a następnie wypełnić ją zerami.
Lepiej jednak w tym wypatku zamiast tablic typu char urzyć stringów. Dorzucanie znaków do obiektu typu string zrobisz wtedy przy pomocy zwykłego dodawania, a porównanie kod z kod2 przy pomocy ==
czacha

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: czacha »

Podalem staly rozmiar tablicy, ale wtedy jak wpisze np 'marcin' to wynik jest 'marcin='. Tutaj jest rezultat programu:

Kod: Zaznacz cały

Podaj haslo:
******
Haslo: marcin=
Poprawne haslo: marcin

Haslo jest bledne
wydaje mi sie ze ten efekt jest spowodowany brakiem znaku zerowego na koncu lancucha. Niewiem jakby go wstawic.

P.S. Jak sprawic zeby zakres wpisanego napisu nie wykroczyl poza tablice.
Czy lepiej bylo by ograniczyc mozliwosc wpisania znakow do 10 czy moze jakos w inny sposob zabezpieczyc? I jak by to mozna zrobic?
Awatar użytkownika
max
Użytkownik
Użytkownik
Posty: 3306
Rejestracja: 10 gru 2005, o 17:48
Płeć: Mężczyzna
Lokalizacja: Lebendigentanz
Podziękował: 37 razy
Pomógł: 778 razy

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: max »

Skoro podałeś stały (np równy n) rozmiar tablicy char, to niezależnie od ilości znaków wpisanych z klawiatury w tablicy tej jest n znaków, przy czym elementy tablicy nie wczytane z klawiatury mają wartości losowe.

Powinno wystarczyć, że po wpisaniu znaków z klawiatury jako kolejny znak w tablicy umieścisz '\0' (znak NULL - oznacza on koniec łańcucha znaków).
czacha

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: czacha »

ale musze umiescic nulla natychmiast po wpisaniu lancucha nie moge np postawic null w ostatnim elemencie np 9 bo kiedy user wpisze 3 znaki to miedzy nimi a nullem pozostanie pustka. Trzeba by jakos zliczyc ile wpisano znakow i nulla stawiac zawsze o miejsce dalej niz ostatni znak

[ Dodano: 29 Grudzień 2006, 15:00 ]
albo dzieki juz sobie dalej poradzilem. dzieki pozdro
Awatar użytkownika
max
Użytkownik
Użytkownik
Posty: 3306
Rejestracja: 10 gru 2005, o 17:48
Płeć: Mężczyzna
Lokalizacja: Lebendigentanz
Podziękował: 37 razy
Pomógł: 778 razy

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: max »

Zauważ, że znasz miejsce w które należy wstawić NULL (jest ono równe wartości zmiennej i po przejściu pętli).
czacha

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: czacha »

Prosze o pomoc w tym kodzie

Kod: Zaznacz cały

while(1)
    {
        int i = 0;
        char kod[10];
        char kod2[] = "marcin";
        char c;
        
        const char ENTER = 13;
        const char BACKSPACE = 8;
    
        cout << "Podaj haslo: " << endl;
      
//petla zajmuje sie wyswietlaniem gwiazdek
        while(1)
        {
            c = getch();
            
            if (c == ENTER)break;
            
            if(c == BACKSPACE)
            {
                 i--;
                 //();
            }
            
            cout << "*";
            kod[i++] = c;//przypisuje pobrany znak c do tablicy i przechodzi do nastepnej litery
        }
        kod[i++] = '\0';//dodaje znak zerowy na koncu lancucha
        
        cout << "Podane haslo: " << kod << endl;
        cout << "Poprawne haslo: " << kod2 << endl;
    
        //sprawdza poprawnosc hasla
        if (strcmp(kod,kod2) == 0)
        {
            cout << "\nHaslo jest poprawne\n";
            break;
        }
        else cout << "\nHaslo jest bledne\n";continue;
    }
ten kod zawiera blad. niewiem jak zrobic zeby po nacisnieciu backspace usuwal sie ostatni znak zarowno z ekranu jak i z pamieci. z gory dziekuje
Awatar użytkownika
max
Użytkownik
Użytkownik
Posty: 3306
Rejestracja: 10 gru 2005, o 17:48
Płeć: Mężczyzna
Lokalizacja: Lebendigentanz
Podziękował: 37 razy
Pomógł: 778 razy

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: max »

Z czyszczeniem ekranu nie pomogę (powinno być coś w nagłówku conio.h ale nie znam tej biblioteki), lecz mogę poprawić czyszczenie pamięci:

Kod: Zaznacz cały

while(1)
    {
        int i = 0;
        char kod[10];
        char kod2[] = "marcin";
        char c;
       
        const char ENTER = 13;
        const char BACKSPACE = 8;
   
        cout << "Podaj haslo: " << endl;
     
//petla zajmuje sie wyswietlaniem gwiazdek
        while(1)
        {
            c = getch();
           
            if (c == ENTER)break;
           
            if(c == BACKSPACE)
            {
                 i--;
                 //();
            }
           else //bez tego po odczytaniu backspace'a znak ten był niepotrzebnie wpisywany do tablicy... no i na ekranie pojawiała się kolejna gwiazdka
            {
                 cout << "*";
                 kod[i++] = c;//przypisuje pobrany znak c do tablicy i przechodzi do nastepnej litery
            }
        }
        kod[i++] = '\0';//dodaje znak zerowy na koncu lancucha
       
        cout << "Podane haslo: " << kod << endl;
        cout << "Poprawne haslo: " << kod2 << endl;
   
        //sprawdza poprawnosc hasla
        if (strcmp(kod,kod2) == 0)
        {
            cout << "\nHaslo jest poprawne\n";
            break;
        }
        else cout << "\nHaslo jest bledne\n";continue;
    }
czacha

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: czacha »

bez else po if(c == BACKSPACE) program sie wieszal. teraz jest o tyle lepiej ze sie nie wiesza ale jak wpisze zly napis to cos jest zle z cofaniem. Pomijajac to ze gwiazdki nie znikaja o czym zreszta wspomniales ze tego nie umiesz.

Przyklad:
Wpisuje marin zamiast marcin. wciskam dwa razy BACKA i wpisuje koncowke ...cin zeby bylo marcin. Wypisany zostaje wyraz wpisany i prawidlowy. oba sa rowne ale haslo jest bledne.

P.S. max dostaniesz ten malo znaczacy punkt bo duzo mi pomogles, bede jednak wdzieczny za dalsze wspieranie mnie w tym temacie
Awatar użytkownika
max
Użytkownik
Użytkownik
Posty: 3306
Rejestracja: 10 gru 2005, o 17:48
Płeć: Mężczyzna
Lokalizacja: Lebendigentanz
Podziękował: 37 razy
Pomógł: 778 razy

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: max »

SOA#1 ;)
u mnie działa
Jednakże sam kod jest dość niezgrabny - np za każdym obrotem 'zewnętrznej' pętli niepotrzebnie deklarujemy te same zmienne. Poza tym program powinien wysypać się gdybyśmy wpisali za dużo znaków (nie zmieściłyby się one w tablicy i mielibyśmy naruszenie pamięci).

To jest nieco solidniejsze:

Kod: Zaznacz cały

int i;
	const int dl = 10;
   char kod[dl];
   char kod2[] = "marcin";
   char c;
	const char ENTER = 13;
   const char BACKSPACE = 8;
  

	while(true)
   {
		i = 0;
      cout << "Podaj haslo: " << endl;
     
      while(true)
      {
			c = getch();
         if (c == ENTER) 
			{
				if(i >= dl) i = dl - 1;
				break;  
			}
         if(c == BACKSPACE)
         {
				i--;
         }
         else
         {
				cout << "*";
				if(i > dl)
            {
               i++;
               continue;
            }
            kod[i++] = c;
         }
		}
      kod[i] = '\0';
       
      cout << "\nPodane haslo: " << kod << endl;
      cout << "Poprawne haslo: " << kod2 << endl;
   
      if (strcmp(kod,kod2) == 0)
      {
			cout << "\nHaslo jest poprawne\n";
         break;
      }
      else cout << "\nHaslo jest bledne\n";
		continue;
	}
A najmniej ograniczeń napotkamy stosując klasę string zamiast tablicy char*
Przykładowy program:

Kod: Zaznacz cały

#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

int main()
{
	int i;
   string kod;
   string kod2 = "marcin";
   char c;
	const char ENTER = 13;
   const char BACKSPACE = 8;
  

	while(true)
   {
      kod.clear();
		i = 0;
      cout << "Podaj haslo: " << endl;
     
      while(true)
      {
			c = getch();
         if (c == ENTER) break;
         if(c == BACKSPACE)
         {
				if(!kod.empty()) kod.erase(kod.length() - 1);
         }
         else
         {
				cout << "*";
            kod.append(1, c);
         }
		}
       
      cout << "\nPodane haslo: " << kod << endl;
      cout << "Poprawne haslo: " << kod2 << endl;
   
      if (kod == kod2)
      {
			cout << "\nHaslo jest poprawne\n";
         break;
      }
      else cout << "\nHaslo jest bledne\n";
		continue;
	}
	system("Pause");
	return 0;
}
czacha

Pobieranie hasla w konsoli, funkcja strcmp() - jezyk c++

Post autor: czacha »

Oba wyjscia wygladaja na wiele lepsze ale skorzystam z pierwszego, poniewaz jako poczatkujacy amator nie jestem jeszcze zbytnio wtajemniczony w operacje zastosowane w drugim kodzie, a nie chcial bym stosowac czegos nie majac pojecia o tego dzialaniu. W kazdym razie dzieki.
ODPOWIEDZ