Search code examples
c++loopswhile-loopfstreamstring-length

Creating a Login and Register with username and password constraints and saving the data in a file. (C++)


I am a beginner at coding and learning C++. I just wrote a code that asks the user to log in, Register, or exit. I thought doing it through functions would be easier. While checking for the constraints of the username and password for registration(referred to as "Rusr" and "Rpwd" here) the code I've written to check if lowercase, uppercase, and digits are not working. I tried to do it with character array as well but that didn't work. Would really appreciate some help with this. Here's my code below for further reference:

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

using namespace std;

bool isvalidName(string Rusr)
{
    if(Rusr.length() > 5 && Rusr.length() < 20) // length constraint
        return true;
    else
        cout << "Invalid username" << endl;

    {
        for(int i = 0; i < Rusr.length(); i++) // check if digits are present
        {
            if(isdigit(Rusr[i]) == true) 
            return true;
            if(true)
                break;
            else
                cout << "Invalid username";
        }
    }

    {
        for(int i = 0; i < Rusr.length(); i++) // check for lowercase
        {
            if(islower(Rusr[i])) {
                return true;
            }
            if(true)
                break;
            else
                cout << "Invalid username";
        }
    }

    {
        for(int i = 0; i < Rusr.length(); i++) // check for uppercase
        {
            if(isupper(Rusr[i])) return true;
            if(true)
                break;
            else
                cout << "Invalid username";
        }
    }
}

int isvalidPwd(string Rpwd) {
    {
        if(Rpwd.length() > 8 && Rpwd.length() < 20)
            return true;
        else
            cout << "Invalid password " << endl;
    }

    {
        for(int i = 0; i < Rpwd.length(); i++) {
            if(isdigit(Rpwd[i]) == true) return true;
            if(true)
                break;
            else
                cout << "Invalid password";
        }
    }

    {
        if(!((Rpwd.find("@") == string::npos) ||
             (Rpwd.find("#") == string::npos) ||
             (Rpwd.find("!") == string::npos) ||
             (Rpwd.find("$") == string::npos) ||
             (Rpwd.find("%") == string::npos) ||
             (Rpwd.find("^") == string::npos) ||
             (Rpwd.find("&") == string::npos) ||
             (Rpwd.find("*") == string::npos) ||
             (Rpwd.find("(") == string::npos) ||
             (Rpwd.find(")") == string::npos) ||
             (Rpwd.find("_") == string::npos) ||
             (Rpwd.find("+") == string::npos) ||
             (Rpwd.find("|") == string::npos) ||
             (Rpwd.find(">") == string::npos) ||
             (Rpwd.find("<") == string::npos) ||
             (Rpwd.find("?") == string::npos) ||
             (Rpwd.find("/") == string::npos) ||
             (Rpwd.find("~") == string::npos) ||
             (Rpwd.find(".") == string::npos) ||
             (Rpwd.find(",") == string::npos)))
            return true;

        else
            cout << "should contain special characters" << endl;
    }

    for(int i = 0; i < Rpwd.length(); i++) {
        if(islower(Rpwd[i])) return true;
        if(true)
            break;
        else
            cout << "should contain lower case";
    }

    {
        for(int i = 0; i < Rpwd.length(); i++) {
            if(isupper(Rpwd[i])) return true;
            if(true)
                break;
            else
                cout << "Should contain upper case";
        }
    }
}

int main() {
    string Lusr, Lpwd, Rusr, Rpwd, name, pwd;

    while(1) {
        cout << "___________________________________" << endl;
        cout << "Chose 1 to Register or 2 to Login" << endl;
        cout << "___________________________________" << endl;
        cout << "1.Register" << endl;
        cout << "2.Login" << endl;
        cout << "3.Exit" << endl;
        cout << "___________________________________" << endl;
        int choice;
        cin >> choice;

        if(choice == 1) // register
        {
            ofstream of("register.txt");
            if(!of.is_open()) {
                cout << "file not exist" << endl;
            }

            do {
                cout << "Username should contain capital,small letters and "
                        "numbers. "
                     << endl;
                cout << "______________________________________" << endl;
                cout << "Enter new username:" << endl;
                cin.ignore();
                getline(cin, Rusr);
                isvalidName(Rusr);
            } while(isvalidName(Rusr) == true);

            do {
                cout << "Password should contain capital,small letters,special "
                        "characters and numbers. "
                     << endl;
                cout << "_______________________________________" << endl;
                cout << "Enter new passsword:" << endl;
                getline(cin, Rpwd);

                isvalidPwd(Rpwd);
            } while(isvalidPwd(Rpwd) == true);

            of << Rusr;
            of << '\n';
            of << Rpwd;
            of.close();
        }

        else if(choice == 2) {
            ifstream f("register.txt");
            if(!f.is_open()) {
                cout << "file not open" << endl;
            }
            getline(f, name, '\n');
            getline(f, pwd, '\n');

            f.close();

            cout << "Enter username:" << endl;
            cin.ignore();
            getline(cin, Lusr);
            cout << "Enter passsword:" << endl;
            getline(cin, Lpwd);

            if(Lpwd == pwd && Lusr == name) {
                cout << "Welcome " << Lusr << endl;
                ;
                break;
            }

            cout << "Wrong name and  password" << endl;
        }

        else if(choice == 3) {
            return 1;
        } else {
            cout << "Invalid input!Try again." << endl;
        }
       
    }
    return 0;
}

Solution

  • Both your functions fail to return the value you've declared that they should return in all branches, so your program has undefined behavior.

    Also, the logic is flawed. Example:

    bool isvalidName(string Rusr) {
        if(Rusr.length() > 5 && Rusr.length() < 20) // length constraint
            return true;
        else
            cout << "Invalid username`enter code here`" << endl;
    
        // .. the rest ...
    }
    

    Here you check that the length is [6, 19] characters long - and return true; - that's all it takes to get Rusr approved. None of the other tests in your function will be executed if the name has an approved length.

    Your code is riddled with similar mistakes.

            for(int i = 0; i < Rusr.length(); i++) // check if digits are present
            {
                if(isdigit(Rusr[i]) == true) return true;
    

    The first digit you encounter makes isvalidName return true - so now you have a name with an invalid length that contains a digit - approved!

    Similar issue below. A name with an illegal length, without digits, that contains a lowercase letter is immediately approved:

            for(int i = 0; i < Rusr.length(); i++) // check for lowercase
            {
                if(islower(Rusr[i])) {
                    return true;
    

    And finally, if a name with an illegal length, without digits and without lowercase letters contains an uppercase letter, it's approved:

            for(int i = 0; i < Rusr.length(); i++) // check for uppercase
            {
                if(isupper(Rusr[i])) return true;
    

    If none of the above applies - you don't return anything (causing undefined behavior).

    Your second function follows this pattern.