1. 程式人生 > 程式設計 >C語言實現密碼本

C語言實現密碼本

本文例項為大家分享了C語言實現密碼本的具體程式碼,供大家參考,具體內容如下

功能簡述:

1.賬號登陸(密碼驗證,三次鎖定賬號)

2.功能選擇:1、檢視所有密碼 2、新增密碼 3、刪除密碼 4、修改密碼 5、查詢密碼 6、解除鎖定 7、退出登陸

3.儲存密碼,檔案加密

4.流程圖:

C語言實現密碼本

資料定義部分

#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);
 }
}

功能就不寫了,原始碼上傳了,下面是執行結果

C語言實現密碼本

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。