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

C++ Błąd w wersji release i nie tylko

Object Storage Arubacloud
+1 głos
265 wizyt
pytanie zadane 18 czerwca 2017 w C i C++ przez Wojciech Gola Nowicjusz (130 p.)

Witam.

Niedawno zacząłem uczyć się języka C++. Zacząłem robić prosty program, lecz w pewnym momencie napotkałem na błąd. Wszystko odbywa się poprzez konsolę, zrobiłem ekran logowania i wszystko działało, ale stwierdziłem, że fajnie byłoby, gdyby hasła nie było widać. Za pierwszym razem wszystko działa, ale przy próbie ponownego wpisania hasła (jeśli poprzednie było błędne cheeky) można wpisać tylko login i program od razu stwierdza, że hasło jest niepoprawne. Dzieje się tak, także podczas uruchomienia programu w trybie Release, tylko tu od razu. Większość pisałem samemu używając różnych for itp. Komentarze dodałem sobie dla utrzymania porządku i łatwiejszej orientacji. 


#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <conio.h>
#include <time.h>
#include <cstdio>
#include <iomanip>

#define _WIN32_WINNT 0x0500

using namespace std;

string login, nr;
string strPass = "";
int powtorzenia, i(4), t, wynik ;
int cntStar;
HANDLE hOut;

void PIK (string txt)
{
    cout<<txt;
    Sleep(t);
    for(int a=0; a<txt.size(); a++)
        cout<<"\b \b";
}

int main()
{WYSWIETLANIE:
 {                                                           //LOSOWE LICZBY
        srand(time(NULL));
        t=rand()%4300+500;
 }
{LOGIN:                                                      //ETAP LOGOWANIA
            i=i-1;


        {hOut= GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
        cout<<endl<<"   Login: ";
        cin>>login;
        cout<<"   Haslo: ";
        {
    char c;
    int StarNum = 0;

    while (c != 13)
    {
        c = (char)getch();
        if(c == 13){ break; }
        if(c == 8)
        {
            strPass = strPass.substr(0, strPass.length() -1);
            StarNum--;
            cntStar = StarNum;
            system("cls");
            while (cntStar > 0){ cout << "*"; cntStar--;}
        }
        else
        {
            StarNum++;
            strPass += c;
            cout << "*";
        }
        }
        }
        system("break");
        while(true)
        {
            if(GetAsyncKeyState(13))
                {
                    if ((login=="Proskate") && (strPass=="programtest"))  //SPRAWDZANIE POPRAWNOSCI LOGINU
                            {i=3;
                                goto ZALOGOWANO;}
                        else
                                goto NIEZALOGOWANO;
                }
        }
        cin>>strPass;
        }
    }
{ZALOGOWANO:                                                 //ETAPY W MOMENCIE ZALOGOWANIA
    {
        hOut= GetStdHandle(STD_OUTPUT_HANDLE);

        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE);
        cout<<endl<<endl<<endl;
        PIK("   Waiting for Server...");
        PIK("   Connecting...");
        PIK("   Checking Password...");
        SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
        PIK("   Password Accepted!");
        system("cls");
        system("cls");

        goto MENU;
    }
}
{NIEZALOGOWANO:                                              //ETAPY W MOMENCIE NIEZALOGOWANIA                                                       //MENU PO ZALOGOWANIU



    {
        hOut= GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE);
        cout<<endl<<endl<<endl;
        PIK("   Waiting for server...");
        PIK("   Connecting...");
        PIK("   Checking Password...");
        SetConsoleTextAttribute(hOut, FOREGROUND_RED);
        PIK("   Wrong Password!");
        system("cls");
        SetConsoleTextAttribute(hOut, FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY);
        cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<"                               POZOSTALO CI "<<i<<" PROB.";
        cout<<endl<<endl<<"                         Wcisnij ENTER, aby ponowic probe.";
            {

                for(; getch() != 13;);                      //CZY ENTER JEST NACISNIETY?
                system("cls");
                if (i<1)                                    //ZAMKNIECIE PO 3 PROBACH
                    exit (0);
                goto LOGIN;
            }
    }
}
{MENU:                                                       //MENU PO ZALOGOWANIU
        {cout<<endl<<"   1.Fanpage."<<endl;
        cout<<"   2.Blender."<<endl;
        cout<<"                                   Wybierz numer: ";
        cin>>nr;
            {
                if (nr=="1")
                    {cout<< ShellExecute(NULL, "open","https://www.facebook.com/proskategrafika/", NULL, NULL, SW_SHOWNORMAL);
                    system("cls");
                    cout<<endl<<endl<<endl<<endl<<"                                 Powodzenie!";
                    Sleep(2000);
                    system("cls");
                    goto MENU;}
                if (nr=="logout")
                    {system("cls");
                    cout<<endl<<endl<<endl<<endl<<"                                 Wylogowano!";
                    Sleep(2500);
                    system("cls");
                    goto LOGIN;}
                if (nr=="2")
                {
                    cout<< ShellExecute (NULL, "open", "steam://rungameid/365670", NULL, NULL, SW_SHOWNORMAL);
                    system("cls");
                    cout<<endl<<endl<<endl<<endl<<"                                 Powodzenie!";
                    Sleep(2000);
                    system("cls");
                    goto MENU;
                }
            }


        }
    return 0;
}
}

 

2
komentarz 18 czerwca 2017 przez j23 Mędrzec (194,920 p.)
edycja 18 czerwca 2017 przez j23

Po co tyle tych goto? O switchach i funkcjach nie słyszał?

2 odpowiedzi

+3 głosów
odpowiedź 18 czerwca 2017 przez j23 Mędrzec (194,920 p.)
edycja 18 czerwca 2017 przez j23
cin >> login;
cout << "   Haslo: ";
{
	char c;
	int StarNum = 0;

	while (c != 13) 
	{
		c = (char)getch();
		...

Dlaczego mieszasz strumienie  <stdio.h> i <iostream>? Bądź konsekwentny i używaj albo jednych, albo drugich. Zamiast getch() daj cin.get(). Powinieneś przypisać jakąś wartość początkową zmiennej c, ewentualnie zmień pętlę na while ((c = cin.get()) != '\n') { ... }  Zamiast magic numbers używaj, w tym przypadku, literałów znakowych, czyli nie 13, tylko '\r' (choć zapewne chodziło Ci o '\n').

 

Za pierwszą linią daj wywołanie cin.ignore(numeric_limits<streamsize>::max(), '\n');

 

I pozbądź się tych koszmarnych goto!

komentarz 18 czerwca 2017 przez Wojciech Gola Nowicjusz (130 p.)

Przypisałem wartość początkową zmiennej c i wszystko zaczęło działać.

Jeszcze tak odnośnie ukrywania hasła. Czy dałbyś rade podpowiedzieć mi, jak mógłbym zrobić kasowanie tych liter, a za razem hasła (jeśli wpiszę o jedną literę za dużo)? Z tego co zauważyłem to po naciśnięciu Backspace pojawiają się nowe gwiazdki.

Goto używam ponieważ zanim ogarnąłem funkcję switch zrobiłem już to z goto.

Dzięki za pomoc :)

komentarz 18 czerwca 2017 przez j23 Mędrzec (194,920 p.)
edycja 18 czerwca 2017 przez j23

i wszystko zaczęło działać.

Ale popraw pętle tak, jak pokazałem, bo teraz jest trochę bez sensu.

 

Co do ograniczania ilości znaków w haśle: lepiej sobie daruj. To nie ten interfejs... tzn. interfejs może i ten, ale nie ta biblioteka - użyj pdcurses lub coś podobnego, jeśli chcesz się bawić w tego typu historie.

0 głosów
odpowiedź 18 czerwca 2017 przez Munvik Dyskutant (9,350 p.)
edycja 18 czerwca 2017 przez Munvik
 cin>>login;
//.....
char c;
int StarNum = 0;
 
  while (c != 13)
  {
   c = (char)getch();
   //...
  }

PO tym jak wpiszesz coś do login'u w buforze jest jeszcze enter.

getch() łapie to i wychodzi c = 13 i pętla sie przerywa przy ifie (c == 13) break;

Wyczyść bufor po cin'ie, chyba to się robi tak:

std::cin.clear();
std::cin.sync();

Albo dodaj po tym cin'ie jeszcze jeden getch();

komentarz 18 czerwca 2017 przez Wojciech Gola Nowicjusz (130 p.)
Próbowałem getch'em i std::cin.clear(); i żaden nie działa. Mógłbyś wpisać to do kodu?
komentarz 18 czerwca 2017 przez Munvik Dyskutant (9,350 p.)
LOGIN:  //ETAP LOGOWANIA
            i=i-1;
 
 
        {hOut= GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hOut, FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
        cout<<endl<<"   Login: ";
        cin>>login;
        getchar(); //getch() u mnie nie działa
        cout<<"   Haslo: ";
        {
   //reszta jak było

 

komentarz 18 czerwca 2017 przez Wojciech Gola Nowicjusz (130 p.)

Nawet skopiowałem kod od Ciebie i dalej nie działa tak, jak powinno :(

Wygląda to tak:

Podobne pytania

0 głosów
1 odpowiedź 276 wizyt
pytanie zadane 17 lutego 2018 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
+1 głos
2 odpowiedzi 360 wizyt
0 głosów
4 odpowiedzi 847 wizyt
pytanie zadane 2 maja 2015 w C i C++ przez Adrian1999 Nałogowiec (34,570 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 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!

...