C語(yǔ)言實(shí)現(xiàn)密碼本
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)密碼本的具體代碼,供大家參考,具體內(nèi)容如下
功能簡(jiǎn)述:
1.賬號(hào)登陸(密碼驗(yàn)證,三次鎖定賬號(hào))
2.功能選擇:1、查看所有密碼 2、新增密碼 3、刪除密碼 4、修改密碼 5、查詢密碼 6、解除鎖定 7、退出登陸
3.保存密碼,文件加密
4.流程圖:

數(shù)據(jù)定義部分
#pragma once
//變量聲明
#define NUM 100 //初始密碼本容量
extern int g_nNum; //當(dāng)前密碼本容量
extern int g_lock_flag; //鎖定標(biāo)志
/* 定義存儲(chǔ)賬戶密碼的結(jié)構(gòu)體****************************/
typedef struct _PASSWORD
{
char website[100]; //站點(diǎn)名
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; //當(dāng)前密碼本容量
g_lock_flag = 1; //鎖定標(biāo)志
/*局部變量定義 ************************************************************************/
PPASSWORD pPwd = nullptr; //密碼數(shù)組指針
int nCount = 0; //當(dāng)前密碼個(gè)數(shù)
int op = 0; //用戶操作
/*本地讀取,初始化密碼本,鎖定標(biāo)志*****************************************************/
readInfo(&pPwd, &nCount);
/*登陸驗(yàn)證==>注冊(cè)和登陸****************************************************************/
if (!g_lock_flag)
{
printf("賬戶已鎖定,請(qǐng)解鎖!\n");
unLock(pPwd, nCount);
}
else
{
login(pPwd, &nCount);
}
/*循環(huán)掃描,功能選擇*********************************************************************/
/*1、查看所有2、新增3、刪除4、修改5、查詢6、解除鎖定7、退出*/
/*密碼校驗(yàn)機(jī)制,三次鎖定,可以登陸,權(quán)限鎖定*/
while (1)
{
Dlg_print();
printf("請(qǐng)輸入操作: ");
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)
{
//開(kāi)辟最大容量空間等待輸入密碼
printf("文件不存在,請(qǐng)注冊(cè)賬號(hào)……\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āng)前容量:%d\n", g_nNum);*/
/*解密*/
if (rlen != g_nNum)
{
printf("密碼文件讀取錯(cuò)誤\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);
}
/*保存密碼,保存鎖定標(biāo)志*/
void saveInfo(PASSWORD pwd[], int nCount)
{
FILE *fp = NULL;
errno_t err;
if ((err = fopen_s(&fp,"password.txt", "wb+")) != 0)
{
printf("打開(kāi)文件失敗\n");
exit(1);
}
fwrite(&nCount, sizeof(int), 1, fp);
fwrite(&g_lock_flag, sizeof(int), 1, fp);
/*先加密再存儲(chǔ)*/
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("文件寫(xiě)入錯(cuò)誤\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)
{
//賬戶不存在---注冊(cè)---保存賬號(hào)密碼
printf("重新輸入密碼: ");
scanf_s("%s", admPwd2,20);
if(strcmp(admPwd1, admPwd2)!=0)
{
printf("兩次密碼不一致,請(qǐng)重新輸入\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("注冊(cè)成功\n");
(*pnCount)++;
saveInfo(pwd, *pnCount);
}
else if (strcmp(admName, pwd[0].userName) == 0)
{
// 賬戶存在,驗(yàn)證密碼
int i = 0;
while (strcmp(admPwd1, pwd[0].passWord) != 0)
{
i++;
if (i >= 3)
{
g_lock_flag = 0;
printf("您的賬戶已被鎖定!請(qǐng)解鎖后再操作!\n");
exit(1);
}
printf("密碼錯(cuò)誤,請(qǐng)重新輸入: ");
scanf_s("%s", admPwd1,20);
}
}
else
{
printf("賬號(hào)密碼錯(cuò)誤\n");
system("pause");
exit(1);
}
}
功能就不寫(xiě)了,源代碼上傳了,下面是運(yùn)行結(jié)果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言帶你學(xué)會(huì)位段相關(guān)知識(shí)
這篇文章主要介紹了什么是位段,位段的聲明和結(jié)構(gòu)是類(lèi)似的,位段的成員必須是 int、unsigned int 或signed int;位段的成員名后邊有一個(gè)冒號(hào)和一個(gè)數(shù)字,本文有詳細(xì)的代碼案例,感興趣的同學(xué)可以參考閱讀2023-04-04
純c語(yǔ)言實(shí)現(xiàn)面向?qū)ο蠓治雠c示例分享
采用C語(yǔ)言實(shí)現(xiàn)的關(guān)鍵是如何運(yùn)用C語(yǔ)言本身的特性來(lái)實(shí)現(xiàn)多態(tài)、繼承面、封裝的面向?qū)ο蟮奶卣?最近給出了例子,大家可以參考使用2014-01-01
C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別
這篇文章主要介紹了C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-04-04
講解C語(yǔ)言編程中指針賦值的入門(mén)實(shí)例
這篇文章主要介紹了講解C語(yǔ)言編程中指針賦值的入門(mén)實(shí)例,通過(guò)const int i與int *const pi這樣兩個(gè)例子來(lái)分析指針的賦值和地址指向,需要的朋友可以參考下2015-12-12

