Проблема с функцией входа в систему в программировании на C

#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");
}
 

Несколько других несвязанных вещей:

  • Спецификатор %[ формата ожидает a char * , а не указатель на массив, поэтому вы хотите перейти loginEmail к scanf вместо amp;loginEmail .
  • rewind(stdin) это не имеет смысла, так что вы можете удалить его.

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