文件处理和字符串(登录系统)

时间:2015-01-02 15:01:09

标签: c

我正在创建一个登录系统。只是基本的,用户名和传递。

=====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();它完美无缺。

这是正确的密码安全性和阅读方式吗?

1 个答案:

答案 0 :(得分:0)

首先,这不是一个特别好的主意,因为它非常不安全。业界已经学习了几十年关于如何不这样做的课程,你正在按照痛苦的方式重新学习这些课程。

至于您的具体问题,在对它运行以空字符结尾的字符串比较之前,您不会终止pass数组。

用5个元素声明它,并将第五个 - pass [4] - 设置为0。