使用C语言创建登录系统

本人大一作品,适合初学者使用,利用优化登陆系统的构建来巩固C语言基础。具体为三个从简单到稍微复杂的登录系统:

第一版本

       ①第一个版本的登录系统十分简陋,只能在当次运行时进行登录和注册,再次运行时需要重新注册才可以登录,并不能实现隐藏密码的功能。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct zhanghu//用户信息储存
{
    char name[20];
    char zhanghao[20];
	char mima[20];
};

int zhuce(struct zhanghu zh[],int m);//注册模块
void denglu(struct zhanghu zh[],int m);//登录模块
void menu(void);//菜单
void again(struct zhanghu zh[], char l[]);//检测模块

int main(void)//主程序
{
    int m=0;
    int k;
    struct zhanghu zh[100];
    while (1)
    {
        menu();
        printf("请选择服务:");
        scanf("%d",&k);
        switch (k)
        {
        case 1:
            zhuce(zh, m);
            m++;
            printf("%dnn",m);
            break;
        case 2:
            denglu(zh, m);
            break;
        case 3:
            printf("谢谢使用!!!n");
            exit(0);
        
        default:
            printf("不存在该服务!!!");
            break;
        }

    }
    return 0;
}

void menu(void)//菜单
{
    printf("---------------------------------------n");
    printf("        1  --- 创建新账户n");
    printf("        2  --- 登录n");
    printf("        3 --- 退出系统n");
    printf("---------------------------------------n");
}


int zhuce(struct zhanghu zh[],int m)//注册模块
{
    char d[20], e[20],l[20];
    printf("用户名:");
    scanf("%s",&l);
    again(zh,l);
    printf("账号:");
   scanf("%s",&d);
    printf("n");
    printf("密码");
    scanf("%s",&e);
    printf("n");
    strcpy(zh[m].name, l);
    strcpy(zh[m].zhanghao,d);
    strcpy(zh[m].mima, e);
    printf("创建成功!n");
    printf("%sn%sn", zh[m].mima, zh[m].zhanghao);
    m++;
    return m;
}

void denglu(struct zhanghu zh[], int m)//登录模块
{
    int g, f, i;
    char d[20], e[20],n[20];
    printf("用户名:");
    scanf("%s",&n);
    printf("账号:");
    scanf("%s", &d);
    printf("n");
    printf("密码");
    scanf("%s", &e);
    printf("n");

    for (i = 0; i < 99; i++)
    {
        if (strcmp(zh[i].name, n) == 0)
        {
            g = strcmp(zh[i].zhanghao, d);
            f = strcmp(zh[i].mima, e);
            if ((g == 0)  && (f == 0) )
            {
                 printf("%s,欢迎回来!!!nn", zh[i].name);
             
            }
            else
            {
                printf("账号或密码错误!!!!nn");
            }
        }
    }
}

void again(struct zhanghu zh[], char l[])//检测模块
{
    int i;
    char z[20];
    strcpy(z, l);
    for (i = 0; i < 99; i++)
    {
        while (strcmp(zh[i].name, z) == 0)
        {
            printf("该用户名已被注册!!!n");
            i = 0;
            printf("用户名:");
            scanf("%s", &z);
        }
    }
    strcpy(l, z);
}

第二版本

       ②第二个版本的登陆系统,将用户信息存储于TXT文件中,需要在目录中添加Users.txt文件,实现了对密码的隐藏,但是存在缺陷。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

typedef struct users//创建用户数据存储单元
{
	char  name[20];
	char  zh[20];
	char  mm[20];
}A; 

void menu();//菜单
void  start(int math);//中转程序
void zhuce();//注册模块
void denglu();//登录模块


int now = 1;
int i;
int main()//主程序
{
	menu();
	return 0;
}


void menu()//菜单
{
	int select=0;
	printf("nttt++++++++++++++++++++++++nttt+  欢迎使用XX登录系统  +nttt++++++++++++++++++++++++n");
	system("color 1F");			//程序面板颜色
	while (now)
	{
		system("cls");
		do 
		{
			printf("n		******************菜单栏*****************n");
			printf("tt*t      ①登录                    *n");
			printf("tt*t      ②注册                    *n");
			printf("tt*t      ③退出系统tt*n");
			printf("		*****************************************n");
			printf("n");
			printf("tt请输入选项:[t]bbb");
			scanf("%d", &select);
		} while (select > 5 ||select < 1);
		start(select);
	}
}

void start(int math)//中转
{
	switch (math)
	{
	case 1:
		denglu();
		break;
	case 2:
		zhuce();
		break;
	case 3:
		printf("感谢您的支持!n欢迎下次使用!");
		now = 0;
		exit(0);
	}
}

void zhuce()//注册模块
{
	system("cls");
	char c[20];
	A a, b;
	FILE* fp;
	printf("ntt欢迎来到注册界面!n");
	Sleep(500);
	fp = fopen("Users.txt","r");
	fread(&b, sizeof(A), 1, fp);
	printf("ntt请设置账号:[ tt ]bbbbbbbbbbbbb");
	scanf("%s",&a.zh);
	while(1)
	{
		if (strcmp(a.zh, b.zh))
		{
			if (!feof(fp))
			{
			  fread(&b, sizeof(A), 1, fp);
			}
			else
			{
				break;
			}
		}
		else 
		{
			printf("该账号已存在!!!");
			Sleep(1000);
			fclose(fp);
			return;
		}
	}
	int time = 2;
	do
	{
		printf("tt请设置密码:[ tt ]bbbbbbbbbbbbb");
		i = 0;
		for (i = 0; i < 20; i++)
		{
			a.mm[i] = _getch();
			if (a.mm[i] == 'r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		a.mm[i] = '';
		printf("n");
		printf("tt请确认密码:[ tt ]bbbbbbbbbbbbb");
		i = 0;
		for (i = 0; i < 20; i++)
		{
			c[i] = _getch();
			if (c[i] == 'r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		c[i] = '';
		printf("n");
		if (!strcmp( a.mm,c) )
		{
			
		    printf("tt请输入用户名:");
			scanf("%s",&a.name);
			fp = fopen("Users.txt", "a");
			fwrite(&a,sizeof(A),1,fp);
			printf("%s,注册成功!!!", a.name);
			fclose(fp);
			Sleep(1500);
			return;
		}
		else
		{
			if (time != 0)
			{
				printf("密码错误!nn请重新输入密码!!nn您还有%d次机会!!!", time);
				time--;
				continue;
			}
			else
			{
				printf("ntt多次输入错误,即将退出!");
				fclose(fp);
				Sleep(1500);
				return;
			}
		}
	} while (time >= 0);
}


void denglu()
{
	system("cls");
	A a,b;
	FILE* fp;
	printf("欢迎来到登录界面!");
	printf("账号:n");
	scanf("%s",&b.zh);
	printf("密码:n");
	i = 0;
	for (i = 0; i < 20; i++)
	{
		b.mm[i] = _getch();
		if (b.mm[i] == 'r')
		{
			break;
		}
		else
		{
			printf("*");
		}
	}
	b.mm[i] = '';
	printf("n");
	fp = fopen("Users.txt", "r");
	while (1)
	{
		fread(&a, sizeof(A), 1, fp);
		//printf("%s %s %sn",a.name,a.zh,a.mm);
		if (strcmp(b.zh,a.zh)==0)
		{
			break;

		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				printf("账号或密码错误!!!n");
				fclose(fp);
				Sleep(1000);
				system("cls");
				return;
			}
		}
	}
	if (strcmp(b.mm, a.mm)==0)
	{
		printf("%s,欢迎回来!!!n",a.name);
		fclose(fp);
		Sleep(1000);
		system("cls");
		return;
	}
	else
	{
		printf("密码错误!!!n");
		fclose(fp);
		Sleep(1000);
		system("cls");
		return;
	}
}

第三版本

       ③第三个版本的登陆系统包含登录注册功能,改密找回功能,还具备管理员系统可以查看和修改用户信息,同样,可以实现隐藏密码的功能,但是存在缺陷。(需要在目录中创建Users.dat和guanliyuan.dat两个文件)

库文件

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

 储存单元的创建

typedef struct users//创建用户数据存储单元
{
	char  name[20];//用户名
	char  zh[20];//账号
	char  mm[20];//密码
	char  question[20];//问题(找回密码时使用)
	char  answer[20];//回答(找回密码时使用)
}A;


typedef struct guanliyuan//设置管理员账号
{
	char glzh[20];//账号
	char glmm[20];//密码
}guanliyuan;

创建函数

int jiancha();//检测是否注册管理员账号
void chuangjianguanliyuan();//在使用前先创建管理员账号
void menu();//菜单
void guanlimenu();//管理员菜单
void  start(int math);//中转模块
void guanlistart(int math);//管理系统中转模块
void zhuce();//注册模块
void denglu();//登录模块
void gaimi();//改密模块
void zhaohui();//找回模块
void guanli();//管理模块
void look();//查看模块
void change();//修改用户模块
void xiugai();//修改管理员账户模块

 主程序

int now = 1;//循环时使用
int i;//函数中的通用整型变量
int main()//主程序
{
	int canshu;
	canshu = jiancha();
	if (canshu==1)
	{
		chuangjianguanliyuan();
	}
	menu();
	return 0;
}

第一次使用时,注册管理员账号

int jiancha()//检测是否注册管理员账号
{
    guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat","rb+");
	char first;
	first = fgetc(fp);
	if (first==-1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


void chuangjianguanliyuan()//在使用前先创建管理员账号
{
	guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat", "rb+");
	char a[20], b[20];
	printf("tt请输入管理员账号:");
	scanf("%s", &a);
	printf("ntt请输入管理员密码:");
	scanf("%s", &b);
	strcpy(guanli.glzh, a);
	strcpy(guanli.glmm, b);
	fwrite(&guanli,sizeof(guanliyuan),1,fp);
	fclose(fp);
	printf("ntt注册成功!");
	Sleep(1000);
	return;
}

 菜单以及中转模块

void menu()//菜单
{
	int select = 0;
	printf("nttt++++++++++++++++++++++++nttt+  欢迎使用XX登录系统  +nttt++++++++++++++++++++++++n");
	system("color 1F");			//程序面板颜色
	while (now)
	{
		system("cls");//每次循环开始时清屏
		do
		{
			system("cls");
			printf("n		******************菜单栏*****************n");
			printf("tt*t      ①登录                    *n");
			printf("tt*t      ②注册                    *n");
			printf("tt*t      ③修改密码                *n");
			printf("tt*t      ④找回密码                *n");
			printf("tt*t      ⑤退出系统                *n");
			printf("		*****************************************n");
			printf("n");
			printf("tt请输入选项:[t]bbb");
			scanf("%d", &select);//
		} while (20221110>select > 6 || select < 1||select>20221112);
		start(select);
	}
}


void start(int math)//中转
{
	switch (math)
	{
	case 1:
		denglu();
		break;
	case 2:
		zhuce();
		break;
	case 3:
		gaimi();
		break;
	case 4:
		zhaohui();
		break;
	case 5:
		printf("感谢您的支持!n欢迎下次使用!");
		now = 0;
		exit(0);
	case 20221111:
		guanli();
		break;
	}
}

注册模块

void zhuce()//注册模块
{
	system("cls");
	char c[20];
	A a, b;
	FILE* fp;
	printf("ntt欢迎来到注册界面!n");
	Sleep(500);
	fp = fopen("Users.dat", "rb+");
	fread(&b, sizeof(A), 1, fp);
	printf("ntt请设置账号:[ tt ]bbbbbbbbbbbbb");
	scanf("%s", &a.zh);
	while (1)//检查是否已存在相同账号
	{
		if (strcmp(a.zh, b.zh))
		{
			if (!feof(fp))
			{
				fread(&b, sizeof(A), 1, fp);
			}
			else
			{
				break;
			}
		}
		else
		{
			printf("该账号已存在!!!");
			Sleep(1000);
			fclose(fp);
			return;
		}
	}
	int time = 2;
	do
	{
		printf("tt请设置密码:[ tt ]bbbbbbbbbbbbb");
		i = 0;
		for (i = 0; i < 20; i++)//获取密码
		{
			a.mm[i] = _getch();
			if (a.mm[i] == 'r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		a.mm[i] = '';
		printf("n");
		printf("tt请确认密码:[ tt ]bbbbbbbbbbbbb");
		i = 0;
		for (i = 0; i < 20; i++)//获取密码
		{
			c[i] = _getch();
			if (c[i] == 'r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		c[i] = '';
		printf("n");
		fclose(fp);
		if (!strcmp(a.mm, c))//如果密码正确
		{

			printf("tt请输入用户名:");
			scanf("%s", &a.name);
			printf("ntt请输入问题(用于找回密码):");
			scanf("%s", &a.question);
			printf("ntt请输入答案:");
			scanf("%s", &a.answer);
			FILE *fw = fopen("Users.dat", "ab+");
			fwrite(&a,sizeof(A),1,fw);
			printf("n%s,注册成功!!!n", a.name);
			fclose(fw);
			Sleep(1500);
			return;
		}
		else//如果两次都密码不相同
		{
			if (time != 0)
			{
				printf("密码错误!nn请重新输入密码!!nn您还有%d次机会!!!n", time);
				time--;
				continue;
			}
			else
			{
				printf("ntt多次输入错误,即将退出!n");
				fclose(fp);
				Sleep(1500);
				return;
			}
		}
	} while (time >= 0);
}

登录模块

void denglu()//登录模块
{
	system("cls");
	A a,b;
	printf("n欢迎来到登录界面!n");
	printf("账号:");
	scanf("%s", &b.zh);
	printf("n密码:");
	i = 0;
	for (i = 0; i < 20; i++)//获取密码
	{
		b.mm[i] = _getch();
		if (b.mm[i] == 'r')
		{
			break;
		}
		else
		{
			printf("*");
		}
	}
	b.mm[i] = '';
	printf("n");
	FILE* fp = fopen("Users.dat", "rb+");//获取用户信息
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		if (strcmp(b.zh, a.zh)==0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				printf("账号错误!!!n");
				Sleep(1500);
				fclose(fp);
				return;
			}
		}
	}
	fclose(fp);
	if (strcmp(b.mm, a.mm)==0 )
	{
		printf("%s,欢迎回来!!!n", a.name);
		Sleep(1000);
		system("cls");
		return;
	}
	else
	{
		printf("密码错误!!!n");
		Sleep(1000);
		system("cls");
		return;
	}
}

改密模块

void gaimi()//改密模块
{
	system("cls");
	A a, b;
	printf("欢迎来到改密界面!n");
	printf("请输入账号:");
	scanf("%s", &b.zh);
	printf("n请输入密码:");
	i = 0;
	for (i = 0; i < 20; i++)
	{
		b.mm[i] = _getch();
		if (b.mm[i] == 'r')
		{
			break;
		}
		else
		{
			printf("*");
		}
	}
	b.mm[i] = '';
	printf("n");
	FILE* pf = fopen("Users.dat", "rb+");
	fread(&a, sizeof(A), 1, pf);
	while (1)
	{
		if (strcmp(b.zh, a.zh) == 0)
		{
			break;
		}
		else
		{
			if (!feof(pf))
			{
				fread(&a, sizeof(A), 1, pf);
			}
			else
			{
				printf("账号错误!!!n");
				Sleep(1500);
				fclose(pf);
				return;
			}
		}
	}
	if (strcmp(b.mm, a.mm) == 0)
	{
		printf("%s,密码正确!!!n", a.name);
		char c[20], d[20];
		int time = 2;
		do
		{
			printf("tt请设置新密码:[ tt ]bbbbbbbbbbbbb");
			i = 0;
			for (i = 0; i < 20; i++)
			{
				c[i] = _getch();
				if (c[i] == 'r')
				{
					break;
				}
				else
				{
					printf("*");
				}
			}
			c[i] = '';
			printf("n");
			printf("tt请确认密码:[ tt ]bbbbbbbbbbbbb");
			i = 0;
			for (i = 0; i < 20; i++)
			{
				d[i] = _getch();
				if (d[i] == 'r')
				{
					break;
				}
				else
				{
					printf("*");
				}
			}
			d[i] = '';
			printf("n");
			
			if (!strcmp(d, c))
			{
				strcpy(a.mm,c);
				fseek(pf, -((int)(sizeof(A) - 40)), SEEK_CUR);//将文件流调回到要修改的密码的位置
				fprintf(pf, "%s", a.mm);//覆盖原来的密码
				printf("密码修改成功,请登录!n");
				Sleep(500);
				fclose(pf);
				Sleep(1500);
				return;
			}
			else
			{
				if (time != 0)
				{
					printf("密码错误!nn请重新输入密码!!nn您还有%d次机会!!!", time);
					time--;
					continue;
				}
				else
				{
					printf("ntt多次输入错误,即将退出!");
					fclose(pf);
					Sleep(1500);
					return;
				}
			}
		} while (time >= 0);
	}
	else
	{
		printf("n密码错误!!!n");
		Sleep(1000);
		system("cls");
		return;
	}

}

找回模块(找回后可以改密) 

void zhaohui()//找回密码模块
{
	system("cls");
	A a, b;
	printf("欢迎来到登录界面!n");
	printf("账号:");
	scanf("%s",b.zh);
	printf("n");
	FILE* fp = fopen("Users.dat", "rb+");
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		if (strcmp(b.zh, a.zh) == 0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				printf("该用户不存在!!!n");
				Sleep(1500);
				fclose(fp);
				return;
			}
		}
	}
	printf("问题:%sn",a.question);
	printf("回答:");
	scanf("%s",b.answer);
	if (strcmp(b.answer, a.answer) == 0)
	{
		printf("您的密码:%sn", a.mm);
		printf("nnnn如要改密请按(1)n返回请按任意键!!!n");
		char fanhui;
		fanhui = _getch();
		if (fanhui == '1')
		{
			char c[20], d[20];
			int time = 2;
			do
			{
				printf("ntt请设置新密码:[ tt ]bbbbbbbbbbbbb");
				i = 0;
				for (i = 0; i < 20; i++)
				{
					c[i] = _getch();
					if (c[i] == 'r')
					{
						break;
					}
					else
					{
						printf("*");
					}
				}
				c[i] = '';
				printf("n");
				printf("ntt请确认密码:[ tt ]bbbbbbbbbbbbb");
				i = 0;
				for (i = 0; i < 20; i++)
				{
					d[i] = _getch();
					if (d[i] == 'r')
					{
						break;
					}
					else
					{
						printf("*");
					}
				}
				d[i] = '';
				printf("n");

				if (!strcmp(d, c))
				{
					strcpy(a.mm, c);
					fseek(fp, -((int)(sizeof(A) - 40)), SEEK_CUR);//将文件流调回到要修改的密码的位置
					fprintf(fp, "%s", a.mm);//覆盖原来的密码
					printf("密码修改成功,请登录!n");
					Sleep(500);
					fclose(fp);
					Sleep(1500);
					return;
				}
				else
				{
					if (time != 0)
					{
						printf("n密码错误!nn请重新输入密码!!nn您还有%d次机会!!!", time);
						time--;
						continue;
					}
					else
					{
						printf("ntt多次输入错误,即将退出!");
						fclose(fp);
						Sleep(1500);
						return;
					}
				}
			} while (time >= 0);
		}
		else
		{
			Sleep(300);
			return;
		}

	}
}

管理员登录模块

void guanli()//管理员登录系统
{
	system("cls");
	guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat", "rb+");
	fread(&guanli,sizeof(guanliyuan),1,fp);
	char c[20], d[20];
	printf("tt管理员账号:");
	scanf("%s",&c);
	printf("ntt管理员密码:");
	scanf("%s",&d);
	if ((0 == strcmp(c, guanli.glzh)) && (strcmp(d, guanli.glmm) == 0))
	{
		guanlimenu();
		return;
	}
	else
	{
		printf("tt账号或密码错误!!!n");
		Sleep(500);
		return;
	}
}


void guanlimenu()//管理员菜单
{
	int select = 0;
	printf("nttt++++++++++++++++++++++++nttt+  欢迎使用管理员系统  +nttt++++++++++++++++++++++++n");
	system("color 1F");			//程序面板颜色
	while (now)
	{
		system("cls");
		do
		{
			system("cls");
			printf("n		******************菜单栏*****************n");
			printf("tt*t      ①查看用户信息                    *n");
			printf("tt*t      ②修改用户信息                    *n");
			printf("tt*t      ③修改管理员账户                  *n");
			printf("tt*t      ④退出系统                        *n");
			printf("		*****************************************n");
			printf("n");
			printf("tt请输入选项:[t]bbb");
			scanf("%d", &select);
		} while (select > 5 || select < 1);
		guanlistart(select);
	}
}


void guanlistart(int math)//中转
{
	switch (math)
	{
	case 1:
		look();
		break;
	case 2:
		change();
		break;
	case 3:
		xiugai();
		break;
	case 4:
		printf("感谢您的支持!n欢迎下次使用!");
		Sleep(500);
		menu();
		break;
	}
}

 管理员功能模块(查看用户信息,修改用户信息,修改管理员账户)

void change()//修改用户信息
{
	system("cls");
	A a,b;
	int number;
	char name[20];
	FILE* fp = fopen("Users.dat","rb+");
	fread(&a,sizeof(A),1,fp);
	printf("请输入要修改账号的用户名:n");
	scanf("%s",&name);
	while (1)
	{
		if (strcmp(a.name, name) == 0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else 
			{
				printf("该用户不存在!!!n");
				fclose(fp);
				Sleep(500);
				return;
			}
		}
	}
	printf("n%sn%sn%sn",a.name,a.zh,a.mm);
	printf("请选择需要修改的项目:用户名(1),账号(2),密码(3)n");
	scanf("%d",&number);
	while (1)
	{
		switch (number)
		{
		case 1:
			printf("新的用户名:");
			scanf("%s",b.name);
			strcpy(a.name,b.name);
			fseek(fp, -((int)(sizeof(A))), SEEK_CUR);
			fprintf(fp, "%s", a.name);
			printf("用户名修改成功!n");
			Sleep(500);
			fclose(fp);
			Sleep(1500);
			return;
		case 2:
			printf("新的账号:");
			scanf("%s", b.zh);
			strcpy(a.zh, b.zh);
			fseek(fp, -((int)(sizeof(A) - 20)), SEEK_CUR);
			fprintf(fp, "%s", a.zh);
			printf("账号修改成功!n");
			Sleep(500);
			fclose(fp);
			Sleep(1500);
			return;
		case 3:
			printf("新的密码:");
			scanf("%s", b.mm);
			strcpy(a.mm, b.mm);
			fseek(fp, -((int)(sizeof(A) - 40)), SEEK_CUR);
			fprintf(fp, "%s", a.mm);
			printf("密码修改成功!n");
			Sleep(500);
			fclose(fp);
			Sleep(1500);
			return;
		}
	}
}

void xiugai()//修改管理员账号
{
	guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat", "rb+");
	char a[20], b[20];
	printf("tt请输入新账号:");
	scanf("%s",&a);
	printf("ntt请输入新密码:");
	scanf("%s", &b);
	strcpy(guanli.glzh, a);
	strcpy(guanli.glmm, b);
	fseek(fp, -((int)(sizeof(guanliyuan))), SEEK_CUR);
	fprintf(fp,"%s",guanli.glzh);
	fseek(fp, -((int)(sizeof(guanliyuan))-20), SEEK_CUR);
	fprintf(fp, "%s", guanli.glmm);
	fclose(fp);
	printf("ntt修改成功!");
	Sleep(1000);
	return;
}

完整代码 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

typedef struct users//创建用户数据存储单元
{
	char  name[20];//用户名
	char  zh[20];//账号
	char  mm[20];//密码
	char  question[20];//问题(找回密码时使用)
	char  answer[20];//回答(找回密码时使用)
}A;


typedef struct guanliyuan//设置管理员账号
{
	char glzh[20];//账号
	char glmm[20];//密码
}guanliyuan;

int jiancha();//检测是否注册管理员账号
void chuangjianguanliyuan();//在使用前先创建管理员账号
void menu();//菜单
void guanlimenu();//管理员菜单
void  start(int math);//中转模块
void guanlistart(int math);//管理系统中转模块
void zhuce();//注册模块
void denglu();//登录模块
void gaimi();//改密模块
void zhaohui();//找回模块
void guanli();//管理模块
void look();//查看模块
void change();//修改用户模块
void xiugai();//修改管理员账户模块


int now = 1;//循环时使用
int i;//函数中的通用整型变量
int main()//主程序
{
	int canshu;
	canshu = jiancha();
	if (canshu==1)
	{
		chuangjianguanliyuan();
	}
	menu();
	return 0;
}

int jiancha()//检测是否注册管理员账号
{
    guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat","rb+");
	char first;
	first = fgetc(fp);
	if (first==-1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


void chuangjianguanliyuan()//在使用前先创建管理员账号
{
	guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat", "rb+");
	char a[20], b[20];
	printf("tt请输入管理员账号:");
	scanf("%s", &a);
	printf("ntt请输入管理员密码:");
	scanf("%s", &b);
	strcpy(guanli.glzh, a);
	strcpy(guanli.glmm, b);
	fwrite(&guanli,sizeof(guanliyuan),1,fp);
	fclose(fp);
	printf("ntt注册成功!");
	Sleep(1000);
	return;
}


void menu()//菜单
{
	int select = 0;
	printf("nttt++++++++++++++++++++++++nttt+  欢迎使用XX登录系统  +nttt++++++++++++++++++++++++n");
	system("color 1F");			//程序面板颜色
	while (now)
	{
		system("cls");//每次循环开始时清屏
		do
		{
			system("cls");
			printf("n		******************菜单栏*****************n");
			printf("tt*t      ①登录                    *n");
			printf("tt*t      ②注册                    *n");
			printf("tt*t      ③修改密码                *n");
			printf("tt*t      ④找回密码                *n");
			printf("tt*t      ⑤退出系统                *n");
			printf("		*****************************************n");
			printf("n");
			printf("tt请输入选项:[t]bbb");
			scanf("%d", &select);//
		} while (20221110>select > 6 || select < 1||select>20221112);
		start(select);
	}
}


void start(int math)//中转
{
	switch (math)
	{
	case 1:
		denglu();
		break;
	case 2:
		zhuce();
		break;
	case 3:
		gaimi();
		break;
	case 4:
		zhaohui();
		break;
	case 5:
		printf("感谢您的支持!n欢迎下次使用!");
		now = 0;
		exit(0);
	case 20221111:
		guanli();
		break;
	}
}


void zhuce()//注册模块
{
	system("cls");
	char c[20];
	A a, b;
	FILE* fp;
	printf("ntt欢迎来到注册界面!n");
	Sleep(500);
	fp = fopen("Users.dat", "rb+");
	fread(&b, sizeof(A), 1, fp);
	printf("ntt请设置账号:[ tt ]bbbbbbbbbbbbb");
	scanf("%s", &a.zh);
	while (1)//检查是否已存在相同账号
	{
		if (strcmp(a.zh, b.zh))
		{
			if (!feof(fp))
			{
				fread(&b, sizeof(A), 1, fp);
			}
			else
			{
				break;
			}
		}
		else
		{
			printf("该账号已存在!!!");
			Sleep(1000);
			fclose(fp);
			return;
		}
	}
	int time = 2;
	do
	{
		printf("tt请设置密码:[ tt ]bbbbbbbbbbbbb");
		i = 0;
		for (i = 0; i < 20; i++)//获取密码
		{
			a.mm[i] = _getch();
			if (a.mm[i] == 'r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		a.mm[i] = '';
		printf("n");
		printf("tt请确认密码:[ tt ]bbbbbbbbbbbbb");
		i = 0;
		for (i = 0; i < 20; i++)//获取密码
		{
			c[i] = _getch();
			if (c[i] == 'r')
			{
				break;
			}
			else
			{
				printf("*");
			}
		}
		c[i] = '';
		printf("n");
		fclose(fp);
		if (!strcmp(a.mm, c))//如果密码正确
		{

			printf("tt请输入用户名:");
			scanf("%s", &a.name);
			printf("ntt请输入问题(用于找回密码):");
			scanf("%s", &a.question);
			printf("ntt请输入答案:");
			scanf("%s", &a.answer);
			FILE *fw = fopen("Users.dat", "ab+");
			fwrite(&a,sizeof(A),1,fw);
			printf("n%s,注册成功!!!n", a.name);
			fclose(fw);
			Sleep(1500);
			return;
		}
		else//如果两次都密码不相同
		{
			if (time != 0)
			{
				printf("密码错误!nn请重新输入密码!!nn您还有%d次机会!!!n", time);
				time--;
				continue;
			}
			else
			{
				printf("ntt多次输入错误,即将退出!n");
				fclose(fp);
				Sleep(1500);
				return;
			}
		}
	} while (time >= 0);
}


void denglu()//登录模块
{
	system("cls");
	A a,b;
	printf("n欢迎来到登录界面!n");
	printf("账号:");
	scanf("%s", &b.zh);
	printf("n密码:");
	i = 0;
	for (i = 0; i < 20; i++)//获取密码
	{
		b.mm[i] = _getch();
		if (b.mm[i] == 'r')
		{
			break;
		}
		else
		{
			printf("*");
		}
	}
	b.mm[i] = '';
	printf("n");
	FILE* fp = fopen("Users.dat", "rb+");//获取用户信息
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		if (strcmp(b.zh, a.zh)==0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				printf("账号错误!!!n");
				Sleep(1500);
				fclose(fp);
				return;
			}
		}
	}
	fclose(fp);
	if (strcmp(b.mm, a.mm)==0 )
	{
		printf("%s,欢迎回来!!!n", a.name);
		Sleep(1000);
		system("cls");
		return;
	}
	else
	{
		printf("密码错误!!!n");
		Sleep(1000);
		system("cls");
		return;
	}
}


void gaimi()//改密模块
{
	system("cls");
	A a, b;
	printf("欢迎来到改密界面!n");
	printf("请输入账号:");
	scanf("%s", &b.zh);
	printf("n请输入密码:");
	i = 0;
	for (i = 0; i < 20; i++)
	{
		b.mm[i] = _getch();
		if (b.mm[i] == 'r')
		{
			break;
		}
		else
		{
			printf("*");
		}
	}
	b.mm[i] = '';
	printf("n");
	FILE* pf = fopen("Users.dat", "rb+");
	fread(&a, sizeof(A), 1, pf);
	while (1)
	{
		if (strcmp(b.zh, a.zh) == 0)
		{
			break;
		}
		else
		{
			if (!feof(pf))
			{
				fread(&a, sizeof(A), 1, pf);
			}
			else
			{
				printf("账号错误!!!n");
				Sleep(1500);
				fclose(pf);
				return;
			}
		}
	}
	if (strcmp(b.mm, a.mm) == 0)
	{
		printf("%s,密码正确!!!n", a.name);
		char c[20], d[20];
		int time = 2;
		do
		{
			printf("tt请设置新密码:[ tt ]bbbbbbbbbbbbb");
			i = 0;
			for (i = 0; i < 20; i++)
			{
				c[i] = _getch();
				if (c[i] == 'r')
				{
					break;
				}
				else
				{
					printf("*");
				}
			}
			c[i] = '';
			printf("n");
			printf("tt请确认密码:[ tt ]bbbbbbbbbbbbb");
			i = 0;
			for (i = 0; i < 20; i++)
			{
				d[i] = _getch();
				if (d[i] == 'r')
				{
					break;
				}
				else
				{
					printf("*");
				}
			}
			d[i] = '';
			printf("n");
			
			if (!strcmp(d, c))
			{
				strcpy(a.mm,c);
				fseek(pf, -((int)(sizeof(A) - 40)), SEEK_CUR);//将文件流调回到要修改的密码的位置
				fprintf(pf, "%s", a.mm);//覆盖原来的密码
				printf("密码修改成功,请登录!n");
				Sleep(500);
				fclose(pf);
				Sleep(1500);
				return;
			}
			else
			{
				if (time != 0)
				{
					printf("密码错误!nn请重新输入密码!!nn您还有%d次机会!!!", time);
					time--;
					continue;
				}
				else
				{
					printf("ntt多次输入错误,即将退出!");
					fclose(pf);
					Sleep(1500);
					return;
				}
			}
		} while (time >= 0);
	}
	else
	{
		printf("n密码错误!!!n");
		Sleep(1000);
		system("cls");
		return;
	}

}


void zhaohui()//找回密码模块
{
	system("cls");
	A a, b;
	printf("欢迎来到登录界面!n");
	printf("账号:");
	scanf("%s",b.zh);
	printf("n");
	FILE* fp = fopen("Users.dat", "rb+");
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		if (strcmp(b.zh, a.zh) == 0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else
			{
				printf("该用户不存在!!!n");
				Sleep(1500);
				fclose(fp);
				return;
			}
		}
	}
	printf("问题:%sn",a.question);
	printf("回答:");
	scanf("%s",b.answer);
	if (strcmp(b.answer, a.answer) == 0)
	{
		printf("您的密码:%sn", a.mm);
		printf("nnnn如要改密请按(1)n返回请按任意键!!!n");
		char fanhui;
		fanhui = _getch();
		if (fanhui == '1')
		{
			char c[20], d[20];
			int time = 2;
			do
			{
				printf("ntt请设置新密码:[ tt ]bbbbbbbbbbbbb");
				i = 0;
				for (i = 0; i < 20; i++)
				{
					c[i] = _getch();
					if (c[i] == 'r')
					{
						break;
					}
					else
					{
						printf("*");
					}
				}
				c[i] = '';
				printf("n");
				printf("ntt请确认密码:[ tt ]bbbbbbbbbbbbb");
				i = 0;
				for (i = 0; i < 20; i++)
				{
					d[i] = _getch();
					if (d[i] == 'r')
					{
						break;
					}
					else
					{
						printf("*");
					}
				}
				d[i] = '';
				printf("n");

				if (!strcmp(d, c))
				{
					strcpy(a.mm, c);
					fseek(fp, -((int)(sizeof(A) - 40)), SEEK_CUR);//将文件流调回到要修改的密码的位置
					fprintf(fp, "%s", a.mm);//覆盖原来的密码
					printf("密码修改成功,请登录!n");
					Sleep(500);
					fclose(fp);
					Sleep(1500);
					return;
				}
				else
				{
					if (time != 0)
					{
						printf("n密码错误!nn请重新输入密码!!nn您还有%d次机会!!!", time);
						time--;
						continue;
					}
					else
					{
						printf("ntt多次输入错误,即将退出!");
						fclose(fp);
						Sleep(1500);
						return;
					}
				}
			} while (time >= 0);
		}
		else
		{
			Sleep(300);
			return;
		}

	}
}


void guanli()//管理员登录系统
{
	system("cls");
	guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat", "rb+");
	fread(&guanli,sizeof(guanliyuan),1,fp);
	char c[20], d[20];
	printf("tt管理员账号:");
	scanf("%s",&c);
	printf("ntt管理员密码:");
	scanf("%s",&d);
	if ((0 == strcmp(c, guanli.glzh)) && (strcmp(d, guanli.glmm) == 0))
	{
		guanlimenu();
		return;
	}
	else
	{
		printf("tt账号或密码错误!!!n");
		Sleep(500);
		return;
	}
}


void guanlimenu()//管理员菜单
{
	int select = 0;
	printf("nttt++++++++++++++++++++++++nttt+  欢迎使用管理员系统  +nttt++++++++++++++++++++++++n");
	system("color 1F");			//程序面板颜色
	while (now)
	{
		system("cls");
		do
		{
			system("cls");
			printf("n		******************菜单栏*****************n");
			printf("tt*t      ①查看用户信息                    *n");
			printf("tt*t      ②修改用户信息                    *n");
			printf("tt*t      ③修改管理员账户                  *n");
			printf("tt*t      ④退出系统                        *n");
			printf("		*****************************************n");
			printf("n");
			printf("tt请输入选项:[t]bbb");
			scanf("%d", &select);
		} while (select > 5 || select < 1);
		guanlistart(select);
	}
}


void guanlistart(int math)//中转
{
	switch (math)
	{
	case 1:
		look();
		break;
	case 2:
		change();
		break;
	case 3:
		xiugai();
		break;
	case 4:
		printf("感谢您的支持!n欢迎下次使用!");
		Sleep(500);
		menu();
		break;
	}
}


void look()//查看用户信息
{
	system("cls");
	FILE* fp = fopen("Users.dat","rb+");
	A a;
	fread(&a, sizeof(A), 1, fp);
	while (1)
	{
		printf("%sn%sn%snn",a.name,a.zh,a.mm);
		if (!feof(fp))
		{
			fread(&a, sizeof(A), 1, fp);
		}
		else
		{
			break;
		}
	}
	char fanhui;
	fanhui = _getch();
	if (fanhui == 'r')
	{
		Sleep(500);
		return;
	}

}


void change()//修改用户信息
{
	system("cls");
	A a,b;
	int number;
	char name[20];
	FILE* fp = fopen("Users.dat","rb+");
	fread(&a,sizeof(A),1,fp);
	printf("请输入要修改账号的用户名:n");
	scanf("%s",&name);
	while (1)
	{
		if (strcmp(a.name, name) == 0)
		{
			break;
		}
		else
		{
			if (!feof(fp))
			{
				fread(&a, sizeof(A), 1, fp);
			}
			else 
			{
				printf("该用户不存在!!!n");
				fclose(fp);
				Sleep(500);
				return;
			}
		}
	}
	printf("n%sn%sn%sn",a.name,a.zh,a.mm);
	printf("请选择需要修改的项目:用户名(1),账号(2),密码(3)n");
	scanf("%d",&number);
	while (1)
	{
		switch (number)
		{
		case 1:
			printf("新的用户名:");
			scanf("%s",b.name);
			strcpy(a.name,b.name);
			fseek(fp, -((int)(sizeof(A))), SEEK_CUR);
			fprintf(fp, "%s", a.name);
			printf("用户名修改成功!n");
			Sleep(500);
			fclose(fp);
			Sleep(1500);
			return;
		case 2:
			printf("新的账号:");
			scanf("%s", b.zh);
			strcpy(a.zh, b.zh);
			fseek(fp, -((int)(sizeof(A) - 20)), SEEK_CUR);
			fprintf(fp, "%s", a.zh);
			printf("账号修改成功!n");
			Sleep(500);
			fclose(fp);
			Sleep(1500);
			return;
		case 3:
			printf("新的密码:");
			scanf("%s", b.mm);
			strcpy(a.mm, b.mm);
			fseek(fp, -((int)(sizeof(A) - 40)), SEEK_CUR);
			fprintf(fp, "%s", a.mm);
			printf("密码修改成功!n");
			Sleep(500);
			fclose(fp);
			Sleep(1500);
			return;
		}
	}
}

void xiugai()//修改管理员账号
{
	guanliyuan guanli;
	FILE* fp;
	fp = fopen("guanliyuan.dat", "rb+");
	char a[20], b[20];
	printf("tt请输入新账号:");
	scanf("%s",&a);
	printf("ntt请输入新密码:");
	scanf("%s", &b);
	strcpy(guanli.glzh, a);
	strcpy(guanli.glmm, b);
	fseek(fp, -((int)(sizeof(guanliyuan))), SEEK_CUR);
	fprintf(fp,"%s",guanli.glzh);
	fseek(fp, -((int)(sizeof(guanliyuan))-20), SEEK_CUR);
	fprintf(fp, "%s", guanli.glmm);
	fclose(fp);
	printf("ntt修改成功!");
	Sleep(1000);
	return;
}