含源码 | C语言做可写入文件的账号密码登录系统

本文分享了一个使用C语言编写的全面的账号登录系统,该系统包括注册、登录、找回密码和密码掩盖功能。代码中,用户数据存储在users.dat文件中,系统通过开关语句进行不同操作的导航,密码输入时以*号掩盖。文章提供了完整的代码实现。
摘要由CSDN通过智能技术生成

账号登录系统在很多系统设计时都时必不可少的,今天这个登录系统功能较全,可以注册,登录,找回密码,修改密码,以及在输入密码时会有*将密码掩盖,还有完善地登录选择界面,废话不多,上代码!

目录

  • 1.头文件&结构体&大概函数实现

  • 2.主函数&登录界面

  • 3.注册系统

  • 4.登录系统

  • 5.找回密码(更改密码)

  • 6.密码输入获取&密码掩盖

  • 7.完整代码!!!!!

首先需要在和.c文件同个目录下新建一个文件储存数据,命名users.dat  

如图:

 也可以命名别的,后缀dat是我自己随便取的,喜欢就行!但是记得在代码中将文件名改过来!

1.头文件&结构体&大概函数实现

//引头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>//用于反应意外情况的,下面会讲到
#include <windows.h>

//定义宏常量
#define MAX_ID 11//ID的最大长度
#define MAX_PWD 20//密码的最大长度
#define MAX_NAME 15//名字的最大长度
#define MAX_SEX 5//性别的最大长度
#define MAX_PHONE 12//电话的最大长度


//创建用户的结构体
typedef struct Users
{
 char id[MAX_ID];//id 即登录的账号
 char pwd[MAX_PWD];//密码
 char name[MAX_NAME];//姓名
 char sex[MAX_SEX];//性别
 char phone[MAX_PHONE];//电话
}Users;

//声明函数

//打印菜单
void menu();

//用户注册
void Register();

//登录
void Login();

//找回密码
void Reback();

 

//定位光标
void gotoxy();

//获取x的位置
int posx();

//获取y的位置
int posy();

//密码输入(含掩盖功能)
void Getpwd(char* pwd);

这里定义了很多宏常量,可以看情况修改合适的数值,比较快捷方便,不用到代码里一个个改

2.主函数&登录界面

void menu()
{
 printf("************************************\n");
 printf("************************************\n");
 printf("*****1.Register         2.Login*****\n");
 printf("*****3.Reback           0.exit *****\n");
 printf("************************************\n");
 printf("************************************\n");
}

int main()
{
 char input;
 do
 {
  menu();
  setbuf(stdin, NULL);//清空输入缓冲区,避免下面getchar读到上一次输入缓冲区剩下的东西
  input = getchar();
  switch (input)
  {
  case '1':
   Register();
   break;
  case '2':
   Login();
   break;
  case '3':
   Reback();
   break;
  case '0':
   printf("退出成功!\n");
   break;
  default:
   printf("选择错误,请重新选择!\n");
   break;
  }
 } while (input!='0');//如果输入了0,就exit退出咯
}

这里用到字符去当作switch的判断依据,是因为如果用整形去做判断依据的话,若向input中输入的东西不是整形而是字符或者字符串,switch在循环中就会陷入死循环,具体情况大家去试试就知道,这里不多讲解,用单个字符判断到现在是没试出什么bug。

3.注册系统

void Register()
{
 Users a, b;//创建用户结构体临时变量,a是用来接收用户输入的,b是用来从文件中读取的,来和a作比较

 char tmp[20]="";//用着下面判断的
  
 printf("欢迎来到注册界面!\n");
 FILE* pf = fopen("users.dat", "rb");//"rb"是以二进制只读方式打开文件的意思
 fread(&b, sizeof(Users), 1, pf);//将数据读入b中
 if (!pf)//如果打开失败
 {
  printf("%s", strerror(errno));//errno可以理解是报的错误对应的编号,strerror可以把这个编号翻译出来,输出在屏幕上
  return;
 }
 Sleep(800);
  
 printf("请输入您的账号>>");
 scanf("%s", a.id);
 while (1)
 {
  if (strcmp(a.id, b.id))//两个用户名不相等
  {
   if (!feof(pf))//没读到文件末尾
   {
    fread(&b, sizeof(Users), 1, pf);//继续读取文件中的用户到b中
   }
   else//读到文件末尾了,确认没有重复的id
   {
    break;
   }
  }
  else//有两个用户名相等
  {
   printf("此用户名已存在在,请重新输入!\n");
   Sleep(1000);
   fclose(pf);//关闭文件
   pf = NULL;//pf置空,避免野指针
   return;
  }
 }
 printf("请输入您的姓名>>");
 scanf("%s", a.name);
 printf("请输入您的性别>>");
 scanf("%s", a.sex);
 printf("请输入您的电
  • 3
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值