• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

wpisywanie hasła i wyświetlanie gwiazdek zamiast liter, scalanie tablic znaków

Object Storage Arubacloud
0 głosów
2,206 wizyt
pytanie zadane 9 lutego 2018 w C i C++ przez Patryk_04 Nowicjusz (230 p.)

Witam, chce zrobić system rejestracji konta w moim programie i napotkałem problem przy wpisywaniu hasła. Chciałem żeby wpisując hasło zamiast wpisywanych liter wyświetlały się gwiazdki. Zrobiłem to tak, że program pobiera znak z klawiatury, wyświetla gwiazdkę i dokleja ten pojedynczy znak do zmiennej w której chce przechować hasło. Wszystko to jest w pętli która kończy się po naciśnięciu enter. Niestety wyskakuje mi cały czas błąd "Access violation reading location 0x0000000000000073" i nie mam pojęcia jak to naprawić. Poniżej kawałek kodu który powinien być za to odpowiedzialny.

#include <stdio.h>
#include <ctype.h>
#include <windows.h>
#include <string.h>

int main()
{
    char Pass;
	char FL[15];
	
        do
	{
		Pass = _getch();
		printf("*");
  
                strcat_s(FL, 15, Pass);

	} while (_getch() != #13);


return(0);

}

 

2 odpowiedzi

+2 głosów
odpowiedź 9 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Te pojedyncze znaki hasła, które kolejno wprowadzasz z klawiatury,. powinny być przez moment widoczne na ekranie, dopiero później nakryte gwiazdką. Tak to powinno wyglądać fachowo.

Dlatego najzwyczajniej wprowadź znak z klawiatury, wyświetl go, a po ok. 0,5s nadrukuj gwiazdkę.
komentarz 9 lutego 2018 przez Patryk_04 Nowicjusz (230 p.)
edycja 9 lutego 2018 przez Patryk_04
Dobry pomysł :) Tylko jak zrobić to tak żeby po wyświetleniu znaku tylko ten znak znikł ?
komentarz 9 lutego 2018 przez Beginer Pasjonat (22,110 p.)
Przecież to będzie zawsze ostatni, aktualnie wprowadzany znak. Z tego co widzę, jesteś na tyle sprawny, że bez problemu poradzisz sobie z nadrukiem gwiazdek. (Może np. trzeba będzie wprowadzić jakiś prosty wewnętrzny licznik, zliczający liczbę już wprowadzonych znaków - tym samym liczbę potrzebnych gwiazdek;  jest ich niewielka liczba). Komplet gwiazdek można również załadować do niewielkiej tablicy znaków char (15), i w zależności od stanu licznika wyprowadzać ich odpowiednią ilość.

P.S. Sorry! Nadaję z tabletu, przy char(15) powinny być nawiasy kwadratowe.
komentarz 9 lutego 2018 przez Patryk_04 Nowicjusz (230 p.)

Rozumiem o co ci chodzi z tą tablicą z gwiazdkami, ale udało mi się to rozwiązać tak:

do
	{
		Pass[0] = _getch();
		Pass[1] = '\0';
		printf("%c", Pass[0]);
		Sleep(100);
		printf("\b");
		printf("*");

		strcat_s(FL, sizeof(FL), Pass);

	} while (Pass[0] != 13);

Drukuje wprowadzony znak, potem zatrzymuje program na chwile, usuwam ten znak i drukuje gwiazdkę.

komentarz 9 lutego 2018 przez Beginer Pasjonat (22,110 p.)
No świetnie, jeszcze prościej!

Szkoda, że nie mam przy sobie komputera i nie mogę zobaczyć w akcji.

P.S. Ja bym ustawił na 200ms, ale mogę się mylić, bo nie widzę na ekranie.
0 głosów
odpowiedź 9 lutego 2018 przez Piotr Batko Stary wyjadacz (13,190 p.)
edycja 9 lutego 2018 przez Piotr Batko

Myślę, że chodzi o to, że w tablicy FL masz śmieci na początku programu. Gdy funkcja strcat_s próbuje znaleźć koniec napisu (czyli znak '\0') nie znajduje go w FL i wyjeżdża poza tablicę, co powoduje błąd. Poza tym w linijce 18 zamiast kolejny raz prosić o znak funkcją _getch, chciałeś użyć już wpisanego wcześniej znaku Pass, prawda?

Edit: Zapomniałem napisać rozwiązania :P Zainicjalizuj FL pustym stringiem.

char FL[15] = "";
1
komentarz 9 lutego 2018 przez Patryk_04 Nowicjusz (230 p.)
Ok rozumiem. W takim razie jak mógłbym to naprawić? Próbowałem napisać tak:

char FL[15] = "a";

żeby sprawdzić czy jeżeli tam będzie już coś zapisane to program sklei te znaki, ale też nie działa. Co do warunku w while ma być Pass, tak jak napisałeś.
komentarz 9 lutego 2018 przez Piotr Batko Stary wyjadacz (13,190 p.)

Wybacz, zamroczyło mnie. To co Ci napisałem to faktycznie był błąd, ale jest jeszcze jeden. Funkcja strcat_s łączy stringi. A to podajesz jako 3. argument to nie jest string, tylko char. Jeżeli zależy Ci na skorzystaniu z strcat_s, powinieneś ten trzeci argument przygotować jako string, czyli tak:

char Pass[2];

Pass[0] = _getch();
Pass[1] = '\0';

Ja bym chyba ten problem rozwiązał trochę inaczej - dorobiłbym sobie wskaźnik wskazujący koniec wprowadzanego przez użytkownika hasła i po każdej wpisanej literce przesuwał go dalej. Na końcu wpisywania dodałbym znak '\0'.

komentarz 9 lutego 2018 przez Patryk_04 Nowicjusz (230 p.)

@Piotr Batko,  Okej zrobiłem to tym pierwszym sposobem i działa. Dzięki za pomoc ;)

Podobne pytania

0 głosów
1 odpowiedź 1,947 wizyt
pytanie zadane 3 grudnia 2015 w C i C++ przez Kaydan Początkujący (260 p.)
0 głosów
4 odpowiedzi 3,634 wizyt
pytanie zadane 3 lipca 2017 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)
0 głosów
2 odpowiedzi 91 wizyt
pytanie zadane 28 marca 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...