C语言实现简单注册登陆功能

时间:2021-04-08 19:32:19

之前在学习用C语言建立通讯录管理系统的时候有想过,怎么为每个用户单独设立通讯录,自然而然想到了最常见的注册与登陆功能,通过不同的账号达到单独设立通讯录的目的。肯定还存在许多问题,当给自己立个flag,未来慢慢磨。以下是实现过程:

注意头文件:

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define bool int //这里用define定义了布尔类型
#define true 1 //避免一些编译器如vs2010没有该头文件无法使用的情况发生
#define false 0 //有些编译器如code:blocks可以直接使用头文件<include stdbool.h>
FILE *fp; //文件指针,不多说
bool judge=true;

先定义一个结构体Users,然后新建结构体pe用来存放用户名和密码。

typedef struct
{
char user[20];
char code[20];
}Users;
Users pe;

然后是编写注册模块。这里多增加了一个”阅读用户手册”,可删改。

/*注册模块*/
void zhuce()
{
char temp[20],txt[100],cha; //定义两个数组,一个存放键盘输入的用户名和密码一个存放用户手册
do
{
printf("\t\t\t\t用户注册");
printf("\n\t\t1.直接注册 2.阅读用户手册");
cha=getch();
if(cha=='2')
{
if((fp=fopen("使用说明.txt","r"))==NULL)
{
printf("\n\t\t打开失败");
exit(0);
}
fread(txt,2,20,fp);
printf("\n\t\t%s",txt);
/*txt=fgets(txt,100,fp);
printf("%s",txt);
}
printf("\n\t\t按任意键继续");
getch();
system("cls");
/*以上部分用于打开用户手册,可删改*/

printf("\t\t\t\t用户注册");
printf("\n\t\t用户名:");
scanf("%s",pe.user);
fp=fopen(pe.user,"r");
/*判断用户名是否重复*/
if(fp!=NULL)
{
printf("\n\t该用户名已存在");
fclose(fp);
printf("\n\t继续注册?(Y/N)");
if(getch()=='Y') return zhuce();
else return denglu();
}
/*确认两次密码输入是否一致*/
printf("\n\t\t密 码:");
scanf("%s",pe.code);
printf("\n\t\t确认密码:");
scanf("%s",temp);
if(strcmp(pe.code,temp)!=0)
printf("\n\t\t两次密码不一致,请重新输入");
}while(strcmp(pe.code,temp)!=0);
/*用户名密码无误,写入文档储存用户信息*/
fp=fopen(pe.user,"w");
if(fp==NULL)
{
printf("\n\t注册失败\n");
exit(0);
}
else
{
system("cls");
printf("\n\t注册成功");
write(); //用户信息写入函数,底下给出
judge = false;
denglu(); //这里跳转到登陆模块
}
}
/*写入用户信息*/
void write()
{
if(fwrite(&pe,sizeof(User),1,fp)!=1)
{
printf("\n\t\t写入文件错误");
exit(0); //写入错误则退出程序
}
}

写完注册模块,接下来就是写登陆模块了,这里的关键就是读取之前存储好的用户信息以及用户的资料

void denglu()
{
char u[20],c[20],temp[20]; //定义两个数组,存放键盘输入的用户名和密码
printf("\n\t\t\t\t用户登录");
printf("\n\t\t用户名:");
scanf("%s",u);
/*判断用户名是否存在*/
fp=fopen(u,"r+");
temp[0]='0';
if(fp==NULL)
{
printf("\n\t\t用户不存在,请注册");
printf("\n\t\t1.注册 2.重新登陆");
temp[0]=getch();
if(temp[0]=='1')
{
system("cls");
zhuce();
}
else return denglu();
}
/*验证密码是否正确*/
do
{
if(judge==true) fread(&pe,sizeof(Users),1,fp); //读取用户信息,即用户名和密码
printf("\t\t密 码:");
scanf("%s",c);
if(strcmp(pe.code,c)!=0) //对比输入的密码和读取的密码
{
printf("\n\t\t密码错误(1.退出 2.重新输入)");
temp[0]=getch();
printf("\n");
if(temp[0]=='1')
{
fclose(fp); //关闭文件防止错误操作
return main();
}
}
}while(temp[0]=='2');
/*readfile();
该函数读取用户自己的资料,需要注意这里用户信息和其资料存储在一个文件中,读取是应适当使用rewind,ftell和fseek跳过一个User大小的空间读取的才是用户的资料*/

getch();
//这里可以设置跳转到操作界面
}

**到这里登陆模块也编写好了,只需要将它添加到已有代码稍微修改下就可以了O(∩_∩)O~**

虽然这个思路很简单,但当初思考的时候还是费劲脑汁,毕竟刚接触C语言,很多东西还不能融会贯通,不能运用自如,甚至会在很简单的问题上纠结几个小时,最后发现的时候真的想抽自己几巴掌,但当最后完工了,真的实现了,好开心好开心!O(∩_∩)O~
然而,实用性确实有限,只能供咱们这些新手小白消遣消遣,而且肯定存在许多漏洞,水平有限,又或者太懒了,真心不找了,这里立个flag,未来的学习之路,咱们慢慢磨!
(*^__^*) 嘻嘻……