C项目实践——密码存储软件

密码存储软件

引言

日常生活中,我们会注册很多平台的账号,然而问题也就随之而来。面临着越来越多的账号,密码记忆也就成了一件让人头大的事。我相信大多数人可能都会选择同一个密码来用于很多账户,包括我自己有时候也是。那有没有一款软件可用于存储我们的密码呢?答案是肯定的。今天我就带来一个用C语言编写的简单的小程序来解决我们的问题。

代码实现

完整源代码如下
需注意,本程序在启动时会自动读取文件,获得数据,需提前新建txt文件
并且第一次编译运行前需将主函数代码中标记的三行先删去,运行保存之后,再加上即可正常使用,无需上述操作
每一项操作完成后将会自动保存,如需撤销某一步操作,直接点击关闭

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include<windows.h> 
#define SIZE 50   //定义密码和账户字符串最大长度 
#define N 100     //定义可存储密码个数 
 
char USER[SIZE]="admin";//初始化用户名 
char CODE[SIZE]="admin";//初始化密码 


struct CODE_data//定义结构体变量存储密码数据 
{
	char name[SIZE];
	char namecode[SIZE];
}data[N];

void save(int n)//将密码个数和结构体变量数据写到文件中 
{
	FILE *fp,*f;
	int i;
	if((fp=fopen("user+code.txt","wb"))==NULL)
	{
		printf("save error!");
		exit(0);
	}
	if((f=fopen("code_count.txt","wb"))==NULL)
	{
		printf("save error!");
		exit(0);
	}
	for(i=0;i<n;i++)
	{
		if(fwrite(&data[i],sizeof(struct CODE_data),1,fp)!=1)
		{
			printf("file write error!");
			exit(0);
		} 
	}
	fputc(n,f);
	printf("save successfully!\n"); 
	fclose(fp);
	fclose(f);
}

int read(int n)// 将密码个数和结构体变量从文件中读取 
{
	FILE *fp1,*f1;
	int i;
	if((fp1=fopen("user+code.txt","rb"))==NULL)
	{
		printf("open error!");
		exit(0);
	}
	if((f1=fopen("code_count.txt","rb"))==NULL)
	{
		printf("open error!");
		exit(0);
	}
	n=fgetc(f1);
	for(i=0;i<n;i++)
	{
		if(fread(&data[i],sizeof(struct CODE_data),1,fp1)!=1)
		{
			printf("read error!");
			exit(0);
		}
	}	
	printf("read successfully!\n");
	fclose(fp1);
	fclose(f1);
	return n;
}


void welcome()//菜单界面 
{ 
	
	printf("*************************************************************************\n");
	printf("-------------------------------------------------------------------------\n");
	printf("------------------------------菜单界面-----------------------------------\n");
	printf("                                                                         \n");
	printf("                   (1)-----------------------更改账户                    \n");
	printf("                   (2)-----------------------新增密码                    \n");
	printf("                   (3)-----------------------删除账号                    \n");
	printf("                   (4)-----------------------更新密码                    \n");
	printf("                   (5)-----------------------查看密码                    \n");
	printf("                   (6)-----------------------退出程序                    \n");
	printf("                                                                         \n");
	printf("-------------------------------------------------------------------------\n");
	printf("------------------------------------------------------Joker->v1.1---\n");
	printf("*************************************************************************\n");
}

void confirm(char in_str1[])//密码二次输入验证 
{
	char in_str2[SIZE];
		printf("请再次输入密码:");
		scanf("%s",in_str2);
		while(strcmp(in_str1,in_str2)!=0)
		{
			printf("请重新输入:");
			scanf("%s",in_str2);
		}
		return;
}

int security()//菜单界面前的安全验证 
{
	char userstr[SIZE];
	char codestr[SIZE];
	int i=0;
	printf("*************************************************************************\n");
	printf("-------------------------------------------------------------------------\n");
	printf("                           安全认证界面                                  \n");
	printf("                                                                         \n");
	printf("---------------------------请输入用户名----------------------------------\n");
	printf("-------------------------------------------------------------------------\n");
	printf("*************************************************************************\n");
	scanf("%s",userstr);
	getchar();
	while(userstr[i]!='\0')
	{
		if((userstr[i]!=USER[i])||strlen(userstr)!=strlen(USER))
		{
			printf("用户名不正确!即将退出程序!");
			Sleep(3000);
			exit(0);
		}
		i++;
	}
	printf("*************************************************************************\n");
	printf("----------------------------请输入密码----------------------------------\n");
	printf("*************************************************************************\n");
	scanf("%s",codestr);
	getchar();
	i=0;
	while(codestr[i]!='\0')
	{
		if((codestr[i]!=CODE[i])||strlen(codestr)!=strlen(CODE))
		{
			printf("密码不正确!即将退出程序!");
			Sleep(3000);
			exit(0);
		}
		i++;
	}
	printf("----------------------------身份验证成功!------------------------------\n"); 
	return 1;
} 

void updateuser()//更新账户密码 
{
	printf("*************************************************************************\n");
	printf("---------------------------请输入新账户账号------------------------------\n");
	printf("*************************************************************************\n");
    scanf("%s",USER);
    getchar();
	printf("*************************************************************************\n");
	printf("---------------------------请输入新账户密码------------------------------\n");
	printf("*************************************************************************\n");
    scanf("%s",CODE);
    confirm(CODE);
    getchar();
    FILE *user,*code;
    if((user=fopen("user.txt","wb"))==NULL)
    {
    	printf("user save error!");
		exit(0); 
	}
	if((code=fopen("code.txt","wb"))==NULL)
    {
    	printf("code save error!");
		exit(0); 
	}
	fputs(USER,user);
	fputs(CODE,code);
	fclose(code);
	fclose(user);
	printf("*************************************************************************\n");
	printf("-------------------------------更新成功----------------------------------\n");
	printf("*************************************************************************\n");	
}

void readuser()//从文件中读取账户和账户密码 
{
	FILE *user,*code;
	if((user=fopen("user.txt","rb"))==NULL)
    {
    	printf("user read error!");
		exit(0); 
	}
	if((code=fopen("code.txt","rb"))==NULL)
    {
    	printf("code read error!");
		exit(0); 
	}
	fgets(USER,SIZE,user);
	fgets(CODE,SIZE,code);
	fclose(user);
	fclose(code);
	printf("user read successfully!\n");
}

void addcode(int *n)//增加新的账号 
{
	int i=*n;
	if(i==N)
	{
		printf("空间已满!\n");
		return;
	}
	printf("请输入账号:");
	scanf("%s",data[i].name);
	getchar();
	printf("请输入密码:");
	scanf("%s",data[i].namecode);
	getchar();
	(*n)++;
	save(*n);
	printf("*************************************************************************\n");
	printf("-------------------------------保存成功----------------------------------\n");
	printf("*************************************************************************\n");
}

void updatacode(int n)//更新账号密码 
{
	int i,j,flag1=1,flag2=1;
	char in_name[SIZE];
	char in_name1[SIZE],in_name2[SIZE];
	printf("请输入要更新的账户:");
	scanf("%s",in_name);
	getchar();
	for(i=0;i<n;i++)
	{
		if(strcmp(in_name,data[i].name)==0)
		{
			flag1=0;
			break;
		}
	}
	if(flag1==1)
	{
		printf("未检索到!请重试!\n");
		return;
	}
	else
	{
		printf("检索成功!请输入新的密码:");
		scanf("%s",in_name1);
		getchar();
		printf("请再次输入密码:");
		scanf("%s",in_name2);
		while(strcmp(in_name1,in_name2)!=0)
		{
			printf("请重新输入:");
			scanf("%s",in_name2);
			getchar();
		}
		j=0;
		while(in_name1[j]!='\0')
		{
			data[i].namecode[j]=in_name1[j];
			j++;
		}
		data[i].namecode[j]='\0';
		save(n);
		printf("*************************************************************************\n");
		printf("-------------------------------更新成功----------------------------------\n");
		printf("*************************************************************************\n");		
		
	}
}

void show(int n)//显示所有账号密码 
{
	int i;
	printf("*****************************************\n");
	printf("账号                 密码                \n");
	for(i=0;i<n;i++)
	{
		printf("%-s  %-s\n",data[i].name,data[i].namecode);
	} 
	if(n==0)printf("无密码!\n");
	printf("*****************************************\n");
}

void del(int *n)//删除指定账号的密码 
{
	int i,j;
	int flag1=1;
	char del_name[SIZE];
	printf("请输入要删除的帐号:");
	scanf("%s",del_name);
	getchar();
	for(i=0;i<*n;i++)
	{
			if(strcmp(del_name,data[i].name)==0)
			{
				flag1=0;
				break;
			}
	}
	if(flag1==1)
	{
		printf("未检索到!请重试!\n");
		return;
	}
	else
	{
		printf("检索成功!\n");
		for(j=i;j<*n-1;j++)
		{
			data[j]=data[j+1];
		}
		(*n)--;
		save(*n);
		printf("*************************************************************************\n");
		printf("-------------------------------删除成功----------------------------------\n");
		printf("*************************************************************************\n");		
	}
}

int main()
{
	int count=0;
	int n;
	count=read(count);//这一行需删去
	readuser();//这一行需删去
	security();//这一行需删去,就只有这三行,之后再加上
	while(1)
	{
		welcome();
		printf("请输入选择:");
		scanf("%d",&n);
		switch(n)//根据输入选择 
		{
			case(1):updateuser();break;
			case(2):addcode(&count);break;
			case(3):del(&count);break;
			case(4):updatacode(count);break;
			case(5):show(count);break;
			case(6):save(count);exit(0);break;//退出程序并自动保存 
			default:printf("数据无效!\n");break;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值