我正在创建一个登录系统。只是基本的用户名和密码。
=====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();
它工作完美。
这是进行密码安全和读取密码的正确方法吗?
最佳答案
首先,这不是一个特别好的主意,因为它非常不安全。业界已经吸取了数十年关于如何不这样做的教训,并且您有望以痛苦的方式重新学习这些教训。
至于您的具体问题,在对 pass
数组运行以 null 终止的字符串比较之前,您不会以 null 终止该数组。
用 5 个元素声明它,并将第五个 - pass[4] - 设置为 0。
关于c - 文件处理和字符串(登录系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744123/