Pomijanie funkcji getline(cin, lnazwa2);

0

Witam, przychodze z problemem otóż program z ktorego korzystam nie chce mi zczytać z kodu funkcji getline tak jakby jej tam nie było nie ma po prostu miejsca żeby użytkownik mogl wpisać to co chce. Od razu mówię że jestem początkujacy z językiem c++ i starałem się zrobić jakiś prymitywny system rejestracji i logowania prosze o jak najszybszą odpowiedź pozdrawiam.

Podczas kompilacji nie zczytuje dokładnie linijki getline(cin, lnazwa2); Od razu przy ponownym logowaniu prosi o podanie hasla.

KOD:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string nazwa;
    string haslo;

    string lnazwa;
    string lhaslo;

    string lnazwa2;
    string lhaslo2;
    int odp;

    cout << "Witamy w naszym systemie logowania i rejestracji!\n";
    cout << "Prosze podac swoja nazwe by sie zarejestrowac: ";
    getline(cin, nazwa, '\n');

    cout << "Teraz prosze o podanie hasla: ";
    getline(cin, haslo, '\n');

    cout << "Rejestracja przebiegla pomyslnie!\n";
    cout << "Teraz prosimy o zalogowanie sie\n";
    cout << "Prosze o podanie nazwy uzytkownika: ";
    getline(cin, lnazwa, '\n');
    cout << "Teraz podaj swoje haslo: ";
    getline(cin, lhaslo, '\n');

    if(nazwa == lnazwa && haslo == lhaslo)
        cout << "Pomyslnie zalogowano!";
    else
       {
        cout << "Bledna nazwa albo haslo...\n";
        cout << "Zaloguj sie ponownie piszac 1 wyjdz z programu piszac 0: ";
        cin >> odp;
      if(odp == 1)
        {
         cout << "Prosze o podanie nazwy uzytkownika: ";
         getline(cin, lnazwa2);

         cout << "Prosze o podanie hasla: ";
         getline(cin, lnazwa2);

        if(nazwa == lnazwa2 && haslo == lhaslo2)
        {
            cout << "Pomyslnie zalogowano!";
        }
        else
            {
                 cout << "Bledna nazwa albo haslo...\n";
            }


        }
      else
        {
                cout << "KONIEC!";
        }

       }
       return 0;
}
5

Wszystko Ci dobrze zczytuje, tylko hasło przypisujesz do tej samej zmiannej co nazwę

cout << "Prosze o podanie nazwy uzytkownika: ";
getline(cin, lnazwa2);

cout << "Prosze o podanie hasla: ";
getline(cin, lnazwa2); // <----------------

Powinieneś mieć raczej tak

cout << "Prosze o podanie nazwy uzytkownika: ";
getline(cin, lnazwa2);

cout << "Prosze o podanie hasla: ";
getline(cin, lhaslo2); // <----------------
0

@several: screenshot-20220221182035.png dalej to samo :/

5

To pewnie zawołania std::cin.sync() Ci gdzieś brakuje. Nie chce mi się szukać w niesformatowanym kodzie, ale strzelam, że tutaj

cout << "Zaloguj sie ponownie piszac 1 wyjdz z programu piszac 0: ";
cin >> odp;
cin.sync();
0

@several: TAK DZIAŁA DZIĘKUJE BARDZO!

6

Brakuje wyjaśnienia na czym polega problem i czemu cin.sync(); pomaga.
Problemem jest cin >> odp;, za którym stoi: getline(cin, lnazwa2);.
Pierwsze nie zjada znaku końca linii, więc getline czyta linię w której znalazła się wartość wstawiona do odp.
Lepszym rozwiązaniem byłoby doczytanie linii do końca.

cout << "Zaloguj sie ponownie piszac 1 wyjdz z programu piszac 0: ";
cin >> odp;
cin.ignore(numeric_limits<streamsize>::max(), '\n');

cin.sync(); pomaga bo ignoruje wszystko co jest w buforze konsoli.

0
std::getline(std::cin >> std::ws, lnazwa2);
2

metoda std::cin.sync(); działa tylko na windows
zamiast tego lepiej używać std::cin.clear(); std::cin.ignore()
Obsługa strumienia wejściowego

1 użytkowników online, w tym zalogowanych: 0, gości: 1