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

question-closed Wyjątek funkcji stoi

Object Storage Arubacloud
0 głosów
478 wizyt
pytanie zadane 26 kwietnia 2018 w C i C++ przez Armando Obywatel (1,870 p.)
zamknięte 27 kwietnia 2018 przez Armando

Witam serdecznie i proszę o pomoc.
Mam pewien kłopot z pisanym programem, który jest już na ostatniej prostej.
Oto co się dzieje: funkcja login pobiera z textboxa login oraz hasło, pobiera również z pliku zaszyfrowany login oraz hasło, deszyfruje je i porównuje. Jeśli znajdzie pasującą parę to przepuszcza użytkownika dalej.
Doszedłem do tego, że funkcja zaznaczona na drugim obrazku, która odszyfrowuje hasło powoduje wystąpienie nieobsługiwanego wyjątku dla funkcji stoi. Co ciekawe, program sypie się dopiero przy drugim odczycie pary danych z pliku, a dla pierwszej pary działa dobrze. Nie mam pojęcia dlaczego tak się dzieje. Dane przechowywane w zmiennych też nie są zbyt duże aby int ich nie pomieścił. Możliwe że przeoczyłem jakiś aspekt, który ma na to wpływ.
Będę wdzięczny za pomoc oraz za jakiekolwiek wskazówki w czym może być problem.

 

Poniżej kod z testowania problemu i występuje on również dla poniższego programu:

string encrypt(string password)
{
	srand(time(NULL));
	int passLength = password.length(),
	    intSeed, seedLen, check;
	string encryptedPassword, seed, strPassLength;

	seedLen = 64 - passLength;

	for (int i = 0; i < seedLen; i++)
	{
		check = rand() % 2;
		if (check == 0)
			seed += lowerCaseGen();
		else
			seed += digitsGen();
	}

	if (passLength < 10)
		strPassLength = '0' + to_string(passLength);
	else
		strPassLength = to_string(passLength);

	encryptedPassword = strPassLength + password + seed;
	passLength = encryptedPassword.length();

	for (int i = 0; i < passLength; i += 2)
	{
		encryptedPassword[i] += passLength;
		encryptedPassword[i+1] -= passLength;
	}

	return encryptedPassword;
}

string decrypt(string encrypted)
{
	string decrypted, strPassLen;
	int passLength = encrypted.length();

	for (int i = 0; i < passLength; i += 2)
	{
		encrypted[i] -= passLength;
		encrypted[i + 1] += passLength;
	}

	strPassLen = encrypted.substr(0, 2);
	if (strPassLen[0] == '0')
		strPassLen = strPassLen.substr(1, 1);
	passLength = stoi(strPassLen);
	decrypted = encrypted.substr(2, passLength);

	return decrypted;
}

void odczyt()
{
	fstream file;
	file.open("passwords.txt", ios::in|ios::app);
	string login, password, decryptedLogin, decryptedPassword;
	file >> login;
	file >> password;
	decryptedLogin = decrypt(login);
	decryptedPassword = decrypt(password);
	cout << decryptedLogin << " " << decryptedPassword << endl;
	file.close();
}

void zapis(string login, string password)
{
	fstream file;
	file.open("passwords.txt", ios::out);
	string encryptedLogin = encrypt(login);
	string encryptedPassword = encrypt(password);
	file << encryptedLogin << " " << encryptedPassword << endl;
	file.close();
}

int main()
{
	zapis("Qt", "123456");
	zapis("1234", "987654321");
	odczyt();

	system("pause");
	return 0;
}

 

komentarz zamknięcia: Problem rozwiązany
1
komentarz 26 kwietnia 2018 przez adrian17 Ekspert (344,860 p.)
(Nie pokazałeś `encrypt()`, więc trudno zreprodukować.)

Skoro masz łatwy dostęp do debuggera, to sprawdź zawartość `strPassLen` w momencie wywoływania `stoi`. Pierwszy strzał to oczywiście, że nie jest liczbowa.
komentarz 26 kwietnia 2018 przez j23 Mędrzec (194,920 p.)
strPassLen = encrypted.substr(0, 2);
    if (strPassLen[0] == '0')
        strPassLen = strPassLen.substr(1, 1);
passLength = stoi(strPassLen);

To wycinanie zera na początku nie jest potrzebne.

 

komentarz 26 kwietnia 2018 przez Armando Obywatel (1,870 p.)

@adrian17, Już wrzuciłem funkcję encrypt ale wątpię, że to po jej stronie jest przyczyna problemu.

komentarz 26 kwietnia 2018 przez adrian17 Ekspert (344,860 p.)
Nie wrzuciłeś też lowerCaseGen/digitsGen...

Powtórzę też propozycję/pytanie: co widzisz w debuggerze tuż przed wywołaniem `stoi`?
komentarz 26 kwietnia 2018 przez Armando Obywatel (1,870 p.)

@j23, Czyli twierdzisz, że jak przekonwertuję stringa np. "01" na inta to funkcja stoi automatycznie usunie mi to 0 z początku i do passLength trafi 1?
Sprawdzę to w wolnej chwili, dzięki za podpowiedź 

komentarz 26 kwietnia 2018 przez Armando Obywatel (1,870 p.)
edycja 26 kwietnia 2018 przez Armando
LowerCaseGen i digitsGen zwraca tylko losowy znak z przedziału kodów ASCII odpowiednio dla małych liter oraz cyfr.
Co do debuggera to wszystko wydaje się być w porządku, ale mogę się mylić.

Screenshot w wyższej rozdzielczości: http://ifotos.pl/z/qnaehhx
komentarz 26 kwietnia 2018 przez adrian17 Ekspert (344,860 p.)
Może źle widzę na tym screenshocie o malutkiej rozdzielczości... ale wygląda to dla mnie, jakby strPassLen miało jakieś znaki nie-cyfrowe.
komentarz 26 kwietnia 2018 przez Armando Obywatel (1,870 p.)
strPassLen to zmienna typu string i przechowuje długość hasła pod postacią stringa wiec jest w porządku
Edit: Okej, rozumiem co masz na myśli, muszę w takim wypadku dokładniej przeanalizować wszystko przy użyciu debuggera skąd takie znaki nie-cyfrowe się tam znalazły
komentarz 27 kwietnia 2018 przez Armando Obywatel (1,870 p.)

Zauważyłem problem. Podczas szyfrowania zdarzało się, że niektóre znaki otrzymywały numer 32 czyli znak spacji. Przez to całe zaszyfrowane ciągi znaków nie dostawały się do zmiennych lecz ich fragment do pierwszego znaku białego.

Temat do zamknięcia, dziękuję! laugh

Podobne pytania

+1 głos
3 odpowiedzi 410 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez robertwe Gaduła (4,620 p.)
0 głosów
1 odpowiedź 748 wizyt
0 głosów
2 odpowiedzi 482 wizyt
pytanie zadane 3 stycznia 2022 w C# przez KonDZIKs Bywalec (2,770 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 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!

...