#c #data-structures #file-io #nested
#c #структуры данных #file-io #вложенный
Вопрос:
Всем доброго дня! Прежде всего, я хочу, чтобы вы все знали, что я новичок в C , поэтому в моем коде будет много ошибок. Я пытался создать программу, чтобы обновить свои представления о C . Проблема, с которой я сталкиваюсь, заключается в том, что программа запрашивает у меня идентификатор электронной почты, но как только я его ввожу, программа завершается. Пожалуйста, дайте мне знать все, что я делаю неправильно, и как это исправить. Большое вам спасибо!
Я решил создать простую программу входа в систему со следующим алгоритмом:
- Он запрашивает у пользователя его идентификатор электронной почты.
- Проверяет, зарегистрировано ли электронное письмо (в текстовом файле)
- Если электронная почта зарегистрирована, пользователю будет предложено ввести пароль.
- Если пароль правильный, выводится сообщение об успешном завершении; если нет, пользователю дается еще 2 попытки.
- Если электронное письмо не зарегистрировано, программа предложит пользователю ввести новый пароль и сообщит ему надежность пароля. Идеальный пароль должен содержать заглавную букву, строчную букву и цифру, а длина пароля должна превышать 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
я бы использовал второй из двух вариантов