2015-01-02 2 views
0

Я создаю систему входа в систему. Просто базовое, имя пользователя и пароль.Обработка файлов и строки (Вход в систему)

=====Log in=== 
user: abcd 
pass: **** 
============== 

не более 4 буквенно-цифровых символов.

struct account 
{ 
user[5]; 
pass[5]; 
}s; 

Например, в моем файле database.txt у меня уже есть это.

abcd //user 
1234 //pass 

Таким образом, в основной его так:

main() 
{ 
FILE *fp; 
fp=fopen("account.txt","r"); 
char user[5],pass[5]; 
printf("enter user: "); 
gets(user); 
printf("enter pass: "); 
pass[0] = getch(); 
printf("*");      //doing this for 
pass[1] = getch();     //password security 
printf("*");      //asterisk(*) 
pass[2] = getch(); 
printf("*"); 
pass[3] = getch(); 
printf("*"); 
pass[4] = '0'; 
getch(); 

while(fread(&s,sizeof(s),1,fp)==1); 
{ 
    if(ferror(fp)) 
    { 
    printf("error"); 
    } 
    else if (strcmp(s.user,user) == 0 && strcmp(s.pass,pass) == 0) 
    { 
    printf("success!"); 
    } 
    else 
    { 
    printf("invalid"); 
    } 
} 
getch(); 
} 

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

gets(pass);, а не pass[0]=getch(); он отлично работает.

Правильный ли это способ защиты паролем и его чтение?

+0

Вы убедились, что вы правильно читаете данные из файла? –

+0

@ScottHunter Да, не возникло проблем при использовании gets (pass); , – imagineracoon

ответ

0

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

Что касается вашей конкретной проблемы, вы не обнуляете нулевой массив pass перед запуском сравнения строк с нулевым завершением.

Объявить его с 5 элементами, и установить пятый - передать [4] - 0.

+1

Отредактировано, но все же оно не работает. Думать, что это не правильный путь. Может быть, у вас есть другой способ сделать это? – imagineracoon

+1

На самом деле вы должны установить последний элемент в 0, который равен '\ 0', который сильно отличается от '0'. Узнайте больше о ascii и строчном представлении на компьютере, если вы не знаете разницы. –

+0

Получил это. Я вспомнил нулевой ограничитель «\ 0». – imagineracoon

Смежные вопросы