Получение пароля от пользователя

#c #cs50

#c #cs50

Вопрос:

В этом коде я пытаюсь получить информацию о пользователе, а затем подтвердить, является ли пользователь правильным пользователем, попросив пользователя ввести свой пароль.

 #include <stdio.h>
#include <cs50.h>

//defaults
int acc_user = 0;
string password_user = "" ;
string name_user = "";
int initial_user = 0 ; 

//decalration
void menu();
int select_acc();
int other_info();
int pinTry();
  

Вот запуск функции, other_info() заключается в доступе к базе данных для получения их информации. После этого печатается имя пользователя и pinTry() остается подтвердить пароль, чтобы продолжить дальше.

 //start 
int main ()
{
    other_info();
    printf("Hello , %sn" , name_user);
    pinTry();
};
void menu()
{
    //display
    printf("1. Balancen2. Cash withdrawaln3. Cash depositionn4. Quitn");
}
int other_info()
{
    //gets all the info of the acc 
    int i ;
    int acc[6] = {12341 ,12342 ,12342 ,12344,12345 };
    string name[5] = {"aabb" , "ccdd" ,"eeff","gghh","iijj"};
    string password[6] = {"a1b2c3" , "a2b2c3" ,"A3b2c3" , "A4b2c3" , "A5b2c3" };
    int initial[6] =  {5000 , 1000 , 25000 , 700 , 100000};
    i = select_acc();
    return acc_user = acc[i] , name_user = name[i] , password_user = password[i] , initial_user = initial[i] ; 
}
int select_acc()
{
    // finding the account and the other information 
    int acc , i ; 
    printf("Account number: ");
    scanf("%dn" , amp;acc);
    if (acc == 12341 )
    { 
        i = 0 ;
    }
    else if (acc == 12342)
    {
        i = 1; 
    }
    else if (acc == 12343 )
    {
        i = 2;
    }
    else if (acc == 12344)
    {
        i = 3;
    }
    else if (acc == 12345)
    {
        i = 4;
    }
    return i ;
};
  

Это та часть, где я пытаюсь сравнить пароль.

 int pinTry()
{
    string input,pin = password_user;
    int pinCount=0;
    while(pinCount <3)
    {
        printf("Enter your pin: ");
        scanf("%s",input);
        pinCount  ;
        if(input = pin)
        {
            printf("Successn");
        }
        else
        {
            printf("Incorrect pinn");
        }

    }
    if(pinCount == 3)
    {
        printf("nToo many incorrect pins, terminating..n");
        printf("Password is : %s" , password_user);
        return 1;
    }
};
  

В этом коде проблема начинается, когда она достигает pinTry() , я понятия не имею, почему, но ошибка — ошибка сегментации (сброс ядра). Могу ли я узнать, что я сделал не так?

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

1. В функции pinTry() , не так if( input == pin ) ли?

2. После его изменения у него все еще есть ошибка ошибки сегментации: (

3. Упростите select_acc() с помощью цикла вместо одного if для каждой записи acc[] . Что-то вроде: определите acc[] как глобальную таблицу (например, acc_tab[]) и выполните a : for (i = 0; i < (sizeof(acc_tab)/sizeof(int)); i ) если (acc_tab[i] == acc) возвращает i;

4. конечно, спасибо за вашу рекомендацию, однако проблема в pinTry() , при удалении pinTry() ошибок нет .

5. Вы не можете сравнивать строки с «==» ‘, используйте: if (!strcmp(ввод, вывод)). Кроме того, ввод должен быть таблицей с выделенным пространством. Что такое «строка» ? Символ * ? Попробуйте, например, «ввод символа [50];».

Ответ №1:

 string input,pin = password_user;
  

string определяется как char * in cs50.h , что означает, что вы выделяете ввод как

 char *input;
  

поскольку эта переменная неинициализирована, она указывает на случайную память.

Когда строка

 scanf("%s",input);
  

достигается, вы пытаетесь поместить данные, которые вы прочитали, в случайную ячейку памяти, вызывая ошибку сегментации.

cs50.h Библиотека предоставляет GetString() функцию, которую вы можете использовать. Заменить

 scanf("%s",input);
  

с помощью

 input = GetString();
  

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

1. И сравнение строк тоже должно быть выполнено strcmp() .