溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用C語言怎么實現(xiàn)一個密碼本

發(fā)布時間:2021-04-16 17:36:41 來源:億速云 閱讀:255 作者:Leah 欄目:編程語言

使用C語言怎么實現(xiàn)一個密碼本?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

功能簡述:

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

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

3.保存密碼,文件加密

4.流程圖:

使用C語言怎么實現(xiàn)一個密碼本

數(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);
 }
}

關(guān)于使用C語言怎么實現(xiàn)一個密碼本問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI