C語言實現密碼本
阿新 • • 發佈:2020-02-27
本文例項為大家分享了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,sizeof(PASSWORD)*NUM); g_nNum = NUM; return; } fread(pnCount,sizeof(int),1,fp); fread(&g_lock_flag,fp); g_nNum = *pnCount; *ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD)*g_nNum); memset(*ppPwd,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,"wb+")) != 0) { printf("開啟檔案失敗\n"); exit(1); } fwrite(&nCount,fp); fwrite(&g_lock_flag,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,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,"管理員賬戶"); 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",20); } } else { printf("賬號密碼錯誤\n"); system("pause"); exit(1); } }
功能就不寫了,原始碼上傳了,下面是執行結果
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。