#c
Вопрос:
Столкнулись с проблемой с функцией входа в систему
Код, который я пишу, является функцией входа в систему в программировании на C, используя этот код, хотя введенное мной электронное письмо уже совпадает с электронным письмом в двоичном файле, но моя программа продолжает сообщать мне неверное электронное письмо, как это решить ?? большое вам спасибо !!!
//tagged structure global
struct Birthday {
int day, year;
char month[10];
};
//typedef structure global
typedef struct {
char icNo[15];
struct Birthday staffBDay;
char email[50];
char contactNo[15];
char password[15];
char position[30];
char faculty[10];
}StaffPrivInfo;
//Structure variable global
struct {
char staffId[15];
char name[30];
char gender;
StaffPrivInfo privInfo;
}staffInfo, modifyInfo[30];
int main() {
char loginEmail[50], loginPass[15];
//binary file pointer declaration
FILE* loginPtr;
//open binary file for reading
loginPtr = fopen("staffInfo.dat", "rb");
//check whether the binary file is exist
if (loginPtr == NULL) {
printf("Unable to append staffInfo.dat file !n");
exit(-1);
}
printf("WELCOME TO ADMINISTRATIVE STAFF MODULE !!!nn");
printf("Loginn");
printf("======n");
while (fread(amp;staffInfo, sizeof(staffInfo), 1, loginPtr) != 0) {
printf("Email: ");
rewind(stdin);
scanf("%[^n]", amp;loginEmail);
if (strcmp(loginEmail, staffInfo.privInfo.email) == 0) {
printf("Password: ");
rewind(stdin);
scanf("%[^n]", amp;loginPass);
if (strcmp(loginPass, staffInfo.privInfo.password) == 0) {
printf("Successfully Login!!!nn");
staffMainMenu();
}
else {
printf("Incorrect Passwordnn");
}
}
else if(strcmp(loginEmail, staffInfo.privInfo.email) != 0) {
printf("Invalid Email !!! Please Re-enter Email: ");
rewind(stdin);
scanf("%[^n]", amp;loginEmail);
}
}
staffMainMenu(); }
Комментарии:
1. Что такое
staffInfo
? Ты никогда не заявляешь об этом.2. Почему
rewind(stdin); scanf("%[^n]", amp;loginEmail);
? Я никогда не видел такой строки ввода, и я скептически отношусь к спецификатору формата вscanf()
вызове.3. @torstenvl Я почти уверен, что строка scanf в порядке. Но я сомневаюсь, что stdin можно перемотать к началу — как вы собираетесь заставить пользователя вводить все эти данные снова точно так же?
scanf("%s", ...)
получает строку, разделенную пробелами, ноscanf("%[^n]", ...)
получает все символы до новой строки.4. 🚫📣🚫 Пожалуйста, полегче со ВСЕМИ ЗАГЛАВНЫМИ БУКВАМИ. Это считается КРИКОМ.
5. Одна из проблем заключается в том, что вам нужно передать указатель на переменную, которую должен заполнить scanf, а loginEmail- это указатель (указатель на строку), так не должно ли это быть
scanf("%[^n]", loginEmail);
и так далее?
Ответ №1:
Ваша программа запрашивает у вас адрес электронной почты для каждой записи в файле данных, и если введенное вами электронное письмо не совпадает с соответствующим электронным письмом, которое вы прочитали из файла, оно сообщает вам, что электронное письмо недействительно.
Вы хотите запросить электронное письмо перед циклом. Затем, находясь в цикле, найдите электронное письмо, введенное пользователем. Если вы его найдете, проверьте пароль. Если вы закончили цикл и не нашли электронное письмо, выведите сообщение об ошибке, в котором будет указано, что электронное письмо неверно.
int found = 0; // flag is set if the email was found
printf("Email: ");
scanf("%[^n]", loginEmail);
while (!found amp;amp; fread(amp;staffInfo, sizeof(staffInfo), 1, loginPtr) != 0) {
if (strcmp(loginEmail, staffInfo.privInfo.email) == 0) {
found = 1;
// check password
}
}
if (!found) {
printf("Invalid Email !!!n");
}
Несколько других несвязанных вещей:
- Спецификатор
%[
формата ожидает achar *
, а не указатель на массив, поэтому вы хотите перейтиloginEmail
кscanf
вместоamp;loginEmail
. rewind(stdin)
это не имеет смысла, так что вы можете удалить его.
Наконец, с точки зрения безопасности вы не хотите печатать разные сообщения для неверного адреса электронной почты/имени пользователя и неверного пароля. В противном случае злоумышленник может угадать адреса электронной почты и узнать, что он нашел действительное электронное письмо, если программа скажет, что пароль неверен.