C语言实现密码本

C语言实现密码本

功能简述:
  1. 账号登陆(密码验证,三次锁定账号)
  2. 功能选择:1、查看所有密码 2、新增密码 3、删除密码 4、修改密码 5、查询密码 6、解除锁定 7、退出登陆
  3. 保存密码,文件加密
  4. 流程图:
    在这里插入图片描述
数据定义部分
#pragma once
//变量声明
#define NUM 100                //初始密码本容量
extern int g_nNum;             //当前密码本容量
extern int g_lock_flag;        //锁定标志
/* 定义存储账户密码的结构体****************************/
typedef struct _PASSWORD
{
	char website[100]; //站点名
	char userName[40];
	char passWord[20];
	char note[100];//备注
}PASSWORD,*PPASSWORD;
/* 定义用户操作枚举 *************************************/
#define 查看所有密码   1
#define 新增密码       2
#define 删除密码       3
#define 修改密码       4
#define 查询密码       5
#define 解除锁定       6
#define 退出           7
界面与用户交互
int main()
{
	/*全局变量初始化**********************************************************************/
	g_nNum = 0;                       //当前密码本容量
	g_lock_flag = 1;                  //锁定标志

	/*局部变量定义 ************************************************************************/
	PPASSWORD pPwd = nullptr;         //密码数组指针
	int nCount = 0;                   //当前密码个数
	int op = 0;                       //用户操作

	/*本地读取,初始化密码本,锁定标志*****************************************************/
	readInfo(&pPwd, &nCount);

	/*登陆验证==>注册和登陆****************************************************************/
	if (!g_lock_flag)
	{
		printf("账户已锁定,请解锁!\n");
		unLock(pPwd, nCount);
	}
	else
	{
		login(pPwd, &nCount);
	}
	
	/*循环扫描,功能选择*********************************************************************/
	/*1、查看所有2、新增3、删除4、修改5、查询6、解除锁定7、退出*/
	/*密码校验机制,三次锁定,可以登陆,权限锁定*/
	while (1)
	{
		Dlg_print();
		printf("请输入操作: ");
		scanf_s("%d", &op);
		switch (op)
		{
		case 查看所有密码: searchAllInfo(pPwd,nCount); break;
		case 新增密码:insertInfo(pPwd, &nCount); break;
		case 删除密码:deleInfo(pPwd, &nCount); break;
		case 修改密码:reviseInfo(pPwd, nCount); break;
		case 查询密码:queryInfo(pPwd, nCount); break;
		case 解除锁定:unLock(pPwd, nCount); break;
		case 退出:admExit(pPwd, nCount); break;
		}
	}
	return 0;
}
读取和保存
/*本地读取,初始化密码本*/
void readInfo(PPASSWORD *ppPwd, int *pnCount)
{
	FILE *fp = NULL;
	errno_t err;
	if ((err = fopen_s(&fp,"password.txt", "rb")) != 0)
	{
		//开辟最大容量空间等待输入密码
		printf("文件不存在,请注册账号……\n");
		//密码数组指针为空,给密码数组指针的地址赋值
		*ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD)*NUM);
		memset(*ppPwd, 0, sizeof(PASSWORD)*NUM);
		g_nNum = NUM;
		return;
	}
	fread(pnCount, sizeof(int), 1, fp);
	fread(&g_lock_flag, sizeof(int), 1, fp);	
	g_nNum = *pnCount;
	*ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD)*g_nNum);
	memset(*ppPwd, 0, sizeof(PASSWORD)*g_nNum);
	size_t rlen = fread(*ppPwd, sizeof(PASSWORD), g_nNum, fp);
	/*printf("密码本密码数量:%d\n", *pnCount);
	printf("密码本锁定状态:%d\n", g_lock_flag);
	printf("密码本当前容量:%d\n", g_nNum);*/
	/*解密*/
	if (rlen != g_nNum)
	{
		printf("密码文件读取错误\n");
		fclose(fp);
		return;
	}
	size_t byteSize = sizeof(PASSWORD)*g_nNum;
	char *buf = (char*)*ppPwd;
	for (size_t i = 0; i < byteSize; i++)
	{
		buf[i] = (buf[i]-i)^8;
	}
	fclose(fp);
}

/*保存密码,保存锁定标志*/
void saveInfo(PASSWORD pwd[], int nCount)
{
	FILE *fp = NULL;
	errno_t err;
	if ((err = fopen_s(&fp,"password.txt", "wb+")) != 0)
	{
		printf("打开文件失败\n");
		exit(1);
	}
	fwrite(&nCount, sizeof(int), 1, fp);
	fwrite(&g_lock_flag, sizeof(int), 1, fp);
	/*先加密再存储*/
	size_t byteSize = sizeof(PASSWORD)*nCount;
	char *buf = (char*)malloc(byteSize);
	memcpy_s(buf, byteSize, pwd, byteSize);
	for (size_t i = 0; i < byteSize; i++)
	{
		buf[i] = (buf[i] ^ 8) + i;
	}
	size_t rlen = fwrite(buf, sizeof(PASSWORD), nCount, fp);
	if (rlen != nCount)
	{
		printf("文件写入错误\n");
	}
	else
	{
		printf("保存成功\n");
	}
	fclose(fp);
	system("pause");
	system("cls");
}
登陆
void login(PASSWORD pwd[],int *pnCount)
{
	char admName[40] = { 0 };
	char admPwd1[20] = { 0 };
	char admPwd2[20] = { 0 };
	printf("*******************************************\n");
	printf("-------------欢迎使用1024密码本------------\n");
	printf("账户: ");
	scanf_s("%s", admName,40);
	printf("密码: ");
	scanf_s("%s", admPwd1,20);

	if (strlen(pwd[0].userName) == 0||g_nNum == 0)              
	{
		//账户不存在---注册---保存账号密码
		printf("重新输入密码: ");
		scanf_s("%s", admPwd2,20);
		if(strcmp(admPwd1, admPwd2)!=0)
		{
			printf("两次密码不一致,请重新输入\n");
			exit(1);
		}
		strcpy_s(pwd[0].website, 100, "密码本");
		strcpy_s(pwd[0].userName, 40, admName);
		strcpy_s(pwd[0].passWord, 20, admPwd1);
		strcpy_s(pwd[0].note, 100, "管理员账户");
		printf("注册成功\n");
		(*pnCount)++;
		saveInfo(pwd, *pnCount);
	}
	else if (strcmp(admName, pwd[0].userName) == 0)
	{
		//	账户存在,验证密码
		int i = 0;
		while (strcmp(admPwd1, pwd[0].passWord) != 0)
		{			
			i++;
			if (i >= 3)
			{
				g_lock_flag = 0;
				printf("您的账户已被锁定!请解锁后再操作!\n");
				exit(1);
			}
			printf("密码错误,请重新输入: ");
			scanf_s("%s", admPwd1,20);
		}
	}
	else
	{
		printf("账号密码错误\n");
		system("pause");
		exit(1);
	}
}
功能就不写了,源代码上传了,下面是运行结果

在这里插入图片描述

  • 13
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值