C語言實現(xiàn)密碼本
更新時間:2020年02月26日 11:15:21 作者:初識逆向
這篇文章主要為大家詳細介紹了C語言實現(xiàn)密碼本,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C語言實現(xiàn)密碼本的具體代碼,供大家參考,具體內(nèi)容如下
功能簡述:
1.賬號登陸(密碼驗證,三次鎖定賬號)
2.功能選擇:1、查看所有密碼 2、新增密碼 3、刪除密碼 4、修改密碼 5、查詢密碼 6、解除鎖定 7、退出登陸
3.保存密碼,文件加密
4.流程圖:

數(shù)據(jù)定義部分
#pragma once
//變量聲明
#define NUM 100 //初始密碼本容量
extern int g_nNum; //當前密碼本容量
extern int g_lock_flag; //鎖定標志
/* 定義存儲賬戶密碼的結(jié)構(gòu)體****************************/
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; //密碼數(shù)組指針
int nCount = 0; //當前密碼個數(shù)
int op = 0; //用戶操作
/*本地讀取,初始化密碼本,鎖定標志*****************************************************/
readInfo(&pPwd, &nCount);
/*登陸驗證==>注冊和登陸****************************************************************/
if (!g_lock_flag)
{
printf("賬戶已鎖定,請解鎖!\n");
unLock(pPwd, nCount);
}
else
{
login(pPwd, &nCount);
}
/*循環(huán)掃描,功能選擇*********************************************************************/
/*1、查看所有2、新增3、刪除4、修改5、查詢6、解除鎖定7、退出*/
/*密碼校驗機制,三次鎖定,可以登陸,權(quán)限鎖定*/
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");
//密碼數(shù)組指針為空,給密碼數(shù)組指針的地址賦值
*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("密碼本密碼數(shù)量:%d\n", *pnCount);
printf("密碼本鎖定狀態(tài):%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);
}
}
功能就不寫了,源代碼上傳了,下面是運行結(jié)果

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL)
這篇文章主要介紹了C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06
詳解C語言編程中的函數(shù)指針以及函數(shù)回調(diào)
這篇文章主要介紹了C語言編程中的函數(shù)指針以及函數(shù)回調(diào),函數(shù)回調(diào)實際上就是讓函數(shù)指針作函數(shù)參數(shù)、調(diào)用時傳入函數(shù)地址,需要的朋友可以參考下2016-04-04

