我正在创建一个登录系统。只是基本的,用户名和传递。
=====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)
首先,这不是一个特别好的主意,因为它非常不安全。业界已经学习了几十年关于如何不这样做的课程,你正在按照痛苦的方式重新学习这些课程。
至于您的具体问题,在对它运行以空字符结尾的字符串比较之前,您不会终止pass
数组。
用5个元素声明它,并将第五个 - pass [4] - 设置为0。