Почему моя программа не обрабатывает все функции?

#c #data-structures #file-io #nested

#c #структуры данных #file-io #вложенный

Вопрос:

Всем доброго дня! Прежде всего, я хочу, чтобы вы все знали, что я новичок в C , поэтому в моем коде будет много ошибок. Я пытался создать программу, чтобы обновить свои представления о C . Проблема, с которой я сталкиваюсь, заключается в том, что программа запрашивает у меня идентификатор электронной почты, но как только я его ввожу, программа завершается. Пожалуйста, дайте мне знать все, что я делаю неправильно, и как это исправить. Большое вам спасибо!

Я решил создать простую программу входа в систему со следующим алгоритмом:

  1. Он запрашивает у пользователя его идентификатор электронной почты.
  2. Проверяет, зарегистрировано ли электронное письмо (в текстовом файле)
  3. Если электронная почта зарегистрирована, пользователю будет предложено ввести пароль.
  4. Если пароль правильный, выводится сообщение об успешном завершении; если нет, пользователю дается еще 2 попытки.
  5. Если электронное письмо не зарегистрировано, программа предложит пользователю ввести новый пароль и сообщит ему надежность пароля. Идеальный пароль должен содержать заглавную букву, строчную букву и цифру, а длина пароля должна превышать 6 символов.

data.h:

 #include <iostream>
#include <string>

using namespace std;

#ifndef DATA_H
#define DATA_H


struct newAccount{


    string email, password; //declaring email and password of the user
};

    string readEmail(string email); //reads in the email id provided
    void checkEmail(); //checks if the entered email address exists in the system
    int addEmail(); //checks if the entered email address exists in the system

    void checkPassword(); //checks if the password matches an already registered email id
    void makeNewPassword(stringamp; password); //this function helps the user create a secure password


#endif
 

data.cpp:

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

using namespace std;

newAccount tempAccount;

string readEmail(string email) //reads in the email id provided
{
    cout << "Enter an email address: ";
    getline(cin, tempAccount.email);
    email = tempAccount.email;
    return tempAccount.email;
}

void checkEmail()
{
    ifstream file("database.txt");
    string str;
    while (getline(file, str))
    {
        if (str == tempAccount.email)
        {
            cout << "This email is already registered. Please enter your password: ";
            getline(cin, tempAccount.password);
            checkPassword();
        }

        else
        {
            cout << "This email is not registered. Please create a new password: ";
            makeNewPassword(tempAccount.password);
        }
    }
}

int addEmail() //checks if the entered email address exists in the system
{
    ofstream myFile("database.txt");
    if (myFile.is_open())
    {
        myFile << tempAccount.email << endl;
        myFile.close();
    }
    else
        cout << "Unable to open file";
    return 0;
}

void checkPassword() //checks if the password matches an already registered email id
{
    ifstream file("database.txt");
    string str;
    while (getline(file, str))
    {
        if (checkEmail)
        {
            if (str == tempAccount.password)
            {
                cout << "Login successful! ";
                getline(cin, tempAccount.password);
            }

            else
                for (int i = 4; i > 1; i--)
                {
                    cout << "Incorrect password! You have " << i - 1 << " tries remaining.n";
                    if (str == tempAccount.password)
                        break;
                }
        }
    }
}

void makeNewPassword(string amp;password) //this function helps the user create a secure password
{
    int n = password.length();
    bool hasLower = false, hasUpper = false, hasDigit = false;

    for (int i = 0; i < n; i  )
    {
        if (islower(password[i]))
            hasLower = true;
        if (isupper(password[i]))
            hasUpper = true;
        if (isdigit(password[i]))
            hasDigit = true;
    }

    // Displaying the strength of password

    cout << "Strength of password you have entered is ";

    if (hasUpper amp;amp; hasDigit amp;amp; hasLower amp;amp; (n >= 6)) // considering a strong must be of length 6 or more
        cout << "strong" << endl;
    else if ((hasLower || hasUpper) amp;amp; hasDigit amp;amp; (n >= 6))
        //when at least a lower case or uppercase is used along with digit
        cout << "moderate" << endl;
    else
        cout << "weak" << endl;
}
 

main.cpp

 #include <iostream>
#include <fstream>
#include "data.h"

using namespace std;

int main(){
    string e, p;
    readEmail(e);
    checkEmail();
return 0;
}
 

Я создал эту программу, зная пару базовых курсов по C , которые я прослушал несколько семестров назад, и используя онлайн-уроки. Это не домашнее задание или какое-либо задание.

Комментарии:

1. Вы будете рады услышать, что вам не нужна ничья помощь, чтобы разобраться в этом, просто инструмент, который у вас уже есть: ваш отладчик! Это именно то, для чего нужен отладчик. Он запускает вашу программу по одной строке за раз и показывает вам, что происходит. Знание того, как использовать отладчик, является необходимым навыком для каждого разработчика C , без исключений. С помощью вашего отладчика вы сможете быстро находить все проблемы в этой и всех будущих программах, которые вы пишете, не обращаясь ни к кому за помощью. Вы уже пробовали использовать свой отладчик? Если нет, то почему нет? Что вам показал ваш отладчик?

2. Похоже, вам нужен обзор кода . На самом деле это не то, что делается на этом сайте. Возможно, вы захотите проверить Code Review на StackExchange.

3. Параметр of string readEmail(string email) бесполезен. Он не читается, и назначение ему чего-либо приведет только к изменению локальной копии. Но это даже не нужно, потому что вы возвращаете результат. К сожалению, вы отбрасываете этот результат main .

4. Возможный виновник: ifstream file("database.txt"); Вам нужно проверить, что файл успешно открыт.

5. После того, как вы исправите ошибку игнорирования / отклонения возвращаемого значения readEmail() in main, я предполагаю, что вы действительно хотите использовать значение e для какой-то цели, иначе спрашивать бессмысленно.

Ответ №1:

В вашей функции readEmail() строка email является локальной переменной. Вы передали переменную в функцию по значению, а не по ссылке. Кроме того, если вы передаете его по ссылке, тогда нет необходимости возвращать что-либо (функция должна быть void ).

 void readEmail(stringamp; email) //reads in the email id provided
{
    cout << "Enter an email address: ";
    cin >> email;
}

int main() {
    string e, p;
    readEmail(e);
    checkEmail();
    return 0;
}
 

Но если вы хотите вернуть значение, тогда параметр не нужен, но вам нужно присвоить это возвращаемое значение вашей переменной.

 string readEmail() //reads in the email id provided
{
    cout << "Enter an email address: ";
    cin >> email;
    return email;
}
int main() {
    string e = readEmail();
    checkEmail();
    return 0;
}
 

Комментарии:

1. Для a std::string я бы использовал второй из двух вариантов