我写的代码功能:实现整个登陆模块,使用链表存储临时用户数据(实际软件,链表应该从数据库中加载数据)。管理员登陆可以查看所有用户信息。
实现注册、登陆、验证、注销、查询。
登陆用户分:普通用户和管理员用户。默认我初始一个管理员,你不需要可以删。
验证规则,你可以在我的验证函数中改。
登陆成功以后,具体做什么我没写,留给你自己发挥!!你在我相关注释的位置添加代码。
注意:如果是实际软件开发,注册需要写入数据库,登陆需要读取数据库,你需要在我相关位置添加数据库写入和读取代码。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#define SIZE 20
typedef struct userInfo//用户信息
{
char uName[SIZE];//用户名
char uPSW[SIZE];//用户密码
int uType;//用户类型:0普通用户;1管理员
struct userInfo *next;
}USERINFO;
int checkUINFO(char *uName,char *uPSW);//验证用户信息合理性,合理返回1,不合理返回0。
USERINFO *regUser(char *uName,char *uPSW,USERINFO *userHead,USERINFO* userTail,int uType);//注册用户,返回尾节点
int showMeu1(USERINFO *userHead,USERINFO** userTail);//显示1级菜单
int showMeu2(int n,USERINFO *userHead,USERINFO** userTail);//显示2级菜单
void printfList(USERINFO *userHead);//测试用函数,打印链表所有数据,正常用户不使用
int login(char *uName,char *uPSW,USERINFO *userHead);//登陆,登陆成功返回1,失败返回0
void initUser();//初始化登陆状态
USERINFO loginUser=
{
{0},
{0},
0,
NULL
};// 全局变量当前登陆的用户
int main()
{
int m;
USERINFO userHead,*userTail=NULL;
userHead.next=NULL;
//-----测试用添加了一个管理员账户,不需要可以删!!---------------
userTail=regUser("admin123","admin123",&userHead,userTail,1);
//-----------------------------------------------------------------
while(1)
{
//printf("loginUser.uName[0]=%d,loginUser.uType=%d\n",loginUser.uName[0],loginUser.uType);
//getch();
if(loginUser.uName[0]==0)
showMeu1(&userHead,&userTail);
else if(loginUser.uName[0]!=0 && loginUser.uType==0)//普通用户登陆,登陆以后想做的操作添加在这里!!!!!!!!
{
printf("退出登陆输入0\n");
scanf("%d",&m);
if(m==0)
initUser();
continue;
}
else if(loginUser.uName[0]!=0 && loginUser.uType==1)//管理员登陆,直接打印全部用户数据
{
system("cls");
printf("当前为管理员登陆,打印所有用户信息:\n");
printfList(&userHead);//测试用函数,打印链表所有数据,正常用户不使用
printf("退出登陆输入0\n");
scanf("%d",&m);
if(m==0)
initUser();
continue;
}
}
return 0;
}
void initUser()//初始化登陆状态
{
memset(loginUser.uName,0,SIZE);
memset(loginUser.uPSW,0,SIZE);
loginUser.uType=0;
loginUser.next=NULL;
}
int showMeu1(USERINFO *userHead,USERINFO** userTail)//显示1级菜单
{
int n;
while(1)
{
system("cls");
printf("1、注册账户\n2、登陆账户\n");
scanf("%d",&n);
if(n!=1 && n!=2)
continue;
return showMeu2(n,userHead,userTail);
}
}
int showMeu2(int n,USERINFO *userHead,USERINFO** userTail)//显示2级菜单
{
int m;
char uName[100]={0}, uPSW[100]={0};
if(n==1)//注册界面
while(1)
{
system("cls");
printf("注册要求:用户名只包含数字、字母及下划线。\n 密码必须包含数字及字母。\n 用户名密码大于6个字符且小于%d!\n",SIZE);
printf("请输入用户名:");
scanf("%s",uName);
printf("请输入密码:");
scanf("%s",uPSW);
*userTail=regUser(uName,uPSW,userHead,*userTail,0);
if(!*userTail)
{
printf("注册失败!输入0重新注册,输入1返回主菜单\n");
while(1)
{
scanf("%d",&m);
if(m==0)
break;
if(m==1)
return n;
}
if(m==0)
continue;
}
else
{
printf("注册成功!按任意键返回。。。。。。\n");
getch();
return n;
}
}
else//登陆界面
while(1)
{
system("cls");
printf("用户名:");
scanf("%s",uName);
printf("密码:");
scanf("%s",uPSW);
if(!login(uName,uPSW,userHead))
continue;
else
{
return n;
}
}
return 1;
}
void printfList(USERINFO *userHead)//测试用函数,打印链表所有数据,正常用户不使用
{
USERINFO *userSave=userHead;
while(userSave->next)
{
printf("用户名:%s\n",userSave->next->uName);
printf("密码:%s\n",userSave->next->uPSW);
printf("类型:%s\n\n",userSave->next->uType?"管理员":"普通用户");
userSave=userSave->next;
}
}
int login(char *uName,char *uPSW,USERINFO *userHead)//登陆,登陆成功返回1,失败返回0
{
USERINFO *userSave=userHead;
while(userSave->next)
{
if(!strcmp(userSave->next->uName,uName) && !strcmp(userSave->next->uPSW,uPSW))
{
printf("登陆成功");
strcpy(loginUser.uName,uName);
strcpy(loginUser.uPSW,uPSW);
loginUser.uType=userSave->next->uType;
return 1;
}
userSave=userSave->next;
}
printf("用户名密码不正确或不存在!按任意键继续。。。。。。\n");
getch();
return 0;
}
int checkUINFO(char *uName,char *uPSW)//验证用户信息合理性,合理返回1,不合理返回0。
{
//用户名和密码的输入规则,在这里添加,要改规则自己加!!!!!!!!!
//我默认规则,用户名大于6个字符且只包含数字、字母及下划线,密码大于6个字符且必须包含数字及字母,用户名密码小于数组上限
int i,len1=strlen(uName),len2=strlen(uPSW),flag1=0,flag2=0;
if(len1>SIZE || len2>SIZE)
{
printf("用户名或密码过长,不得超过%d个字符!!\n",SIZE);
return 0;
}
if(len1<6 || len2<6)
{
printf("用户名或密码必须大于6个字符\n");
return 0;
}
for(i=0;i<len1;i++)
{
if(!(uName[i]>=48 && uName[i]<=57) && !(uName[i]>=65 && uName[i]<=90) &&!(uName[i]>=97 && uName[i]<=122) && uName[i]!='_')
{
printf("用户名只能包含数字、字母及下划线!!\n");
return 0;
}
}
for(i=0;i<len2;i++)
{
if(uPSW[i]>=48 && uPSW[i]<=57)
flag1=1;
if((uPSW[i]>=65 && uPSW[i]<=90) || (uPSW[i]>=97 && uPSW[i]<=122))
flag2=1;
}
if(flag1==0 || flag2==0)
{
printf("密码必须包含数字及字母!!\n");
return 0;
}
return 1;
}
USERINFO *regUser(char *uName,char *uPSW,USERINFO *userHead,USERINFO* userTail,int uType)//注册用户,返回尾节点
{
USERINFO *userNew=NULL;
if(checkUINFO(uName,uPSW))//通过验证
{
userNew=(USERINFO *)malloc(sizeof(USERINFO));
userNew->next=NULL;
strcpy(userNew->uName,uName);
strcpy(userNew->uPSW,uPSW);
userNew->uType=uType;
}
else
return NULL;
if(userHead->next==NULL)
userHead->next=userNew;
else
userTail->next=userNew;
userTail=userNew;
//如果是正常软件,这里应该把注册信息写入数据库,数据库insert语句写在这里!!!!
//-----------------------------------------------------------------------------------
return userTail;
}