#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()
.