引言
日常生活中,我们会注册很多平台的账号,然而问题也就随之而来。面临着越来越多的账号,密码记忆也就成了一件让人头大的事。我相信大多数人可能都会选择同一个密码来用于很多账户,包括我自己有时候也是。那有没有一款软件可用于存储我们的密码呢?答案是肯定的。今天我就带来一个用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;
}