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