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

标签 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(); 它工作完美。

这是进行密码安全和读取密码的正确方法吗?

最佳答案

首先,这不是一个特别好的主意,因为它非常不安全。业界已经吸取了数十年关于如何不这样做的教训,并且您有望以痛苦的方式重新学习这些教训。

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

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

关于c - 文件处理和字符串(登录系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744123/

相关文章:

c - 为字符串的实际长度分配足够的空间

c - 没有额外的 "printf"我的代码给我段错误(核心转储)错误

C 中的命令行参数问题

c - MINIX 3 作为 dns 服务器?

C解密程序

c - 调试时,单线程应用程序会在内核之间跳转吗?

c - 如何检查两个可执行二进制文件是否是从相同的源代码生成的?

你还能用旧方法在 C 中使用可变参数吗?

c - 输入文本文件时文件无法正确输出

c - 在纯 C 列表实现方面需要帮助