C語(yǔ)言實(shí)現(xiàn)密碼本小項(xiàng)目
一、引言
學(xué)C語(yǔ)言有一段時(shí)間了,趁著正好做了密碼本的小項(xiàng)目,把它分享出來(lái)。
二、思路與原理
密碼本,見名知意,就是存放賬號(hào)密碼,起到備忘錄作用的本子,將需要備忘的數(shù)據(jù)通過(guò)加密存放在文本文件中,打開的文本文件為加密文本,需要通過(guò)軟件查看已經(jīng)存放的數(shù)據(jù),提高安全性。(軟件設(shè)計(jì)了啟動(dòng)密碼,三次過(guò)后自動(dòng)退出)
項(xiàng)目目標(biāo):
- 保存賬號(hào)密碼,退出后打開軟件數(shù)據(jù)不丟失
- 進(jìn)行簡(jiǎn)單加密
- 能按條件查找賬號(hào)密碼
- 能修改賬號(hào)密碼數(shù)據(jù)
- 能按條件進(jìn)行刪除數(shù)據(jù)
知識(shí)涉及到數(shù)組、文件操作的使用以及簡(jiǎn)單異或加密。
軟件的部分截圖如下:
主菜單
增加數(shù)據(jù)
刪除數(shù)據(jù)
查詢數(shù)據(jù)
全部數(shù)據(jù)
三、實(shí)現(xiàn)
1.頭文件及數(shù)據(jù)定義
在密碼本的小項(xiàng)目中我設(shè)立四個(gè)了存放數(shù)據(jù)的數(shù)組,所存放的賬號(hào)密碼的站點(diǎn),存放的賬號(hào),存放的密碼以及備注。定義了一個(gè)全局變量,用來(lái)計(jì)數(shù)當(dāng)前密碼本使用的條數(shù)。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //定義四個(gè)數(shù)組,用來(lái)存放站點(diǎn)、賬號(hào)、密碼、備注的值 char webSite[100][20]; char userName[100][20]; char passWord[100][20]; char reMark[100][20]; //定義一個(gè)全局變量 int g_count = 0;
2.程序的整體框架
int main(void) { InitInfo(); int nChoice = 1; StartPassWord(); while (nChoice) { printf("*********************************歡迎使用密碼本*********************************\n"); printf(" 請(qǐng)輸入以下選項(xiàng)進(jìn)行操作: \n"); printf(" 1、增加數(shù)據(jù) \n"); printf(" 2、刪除數(shù)據(jù) \n"); printf(" 3、修改數(shù)據(jù) \n"); printf(" 4、查詢數(shù)據(jù) \n"); printf(" 5、全部數(shù)據(jù) \n"); printf(" 6、結(jié)束程序 \n"); printf("********************************************************************************\n"); scanf_s("%d", &nChoice); switch (nChoice) { case 1: { AddInfo();//增加數(shù)據(jù) }break; case 2: { DelInfo(); //刪除數(shù)據(jù) }break; case 3: { EditInfo();//修改數(shù)據(jù) }break; case 4: { FindInfo();//查詢數(shù)據(jù) }break; case 5: { ReadAllInfo();//查看全部 }break; case 6: { nChoice = 0;//退出程序 }break; } } printf("歡迎下次使用!\n"); system("pause"); return 0; }
3.函數(shù)的聲明
//啟動(dòng)時(shí)輸入密碼 void StartPassWord(); //增加數(shù)據(jù) void AddInfo(); //刪除數(shù)據(jù) void DelInfo(); //修改數(shù)據(jù) void EditInfo(); //查詢數(shù)據(jù) void FindInfo(); //讀取全部數(shù)據(jù) void ReadAllInfo(); //保存數(shù)據(jù) void SaveInfo(); //初始化數(shù)據(jù) void InitInfo();
4.各個(gè)函數(shù)的實(shí)現(xiàn)
//增加數(shù)據(jù) void AddInfo() { printf("輸入需要存儲(chǔ)的 站點(diǎn):"); scanf_s("%s", webSite[g_count], 20); printf("輸入需要存儲(chǔ)的 賬號(hào):"); scanf_s("%s", userName[g_count], 20); printf("輸入需要存儲(chǔ)的 密碼:"); scanf_s("%s", passWord[g_count], 20); printf("輸入需要存儲(chǔ)的 備注:"); scanf_s("%s", reMark[g_count], 20); g_count++; SaveInfo(); InitInfo(); system("pause"); system("cls"); } //查看全部 void ReadAllInfo() { FILE *pfile; if (fopen_s(&pfile, "data.i", "r") != 0) { printf("file open fail"); exit(1); } fscanf_s(pfile, "當(dāng)前個(gè)數(shù)%d\n", &g_count); printf("當(dāng)前有%d條數(shù)據(jù)\n", g_count); for (int i = 0; i < g_count; i++) { printf("第%d條數(shù)據(jù):\n", i + 1); printf("站點(diǎn):%s,賬號(hào):%s,密碼:%s,備注:%s", webSite[i], userName[i], passWord[i], reMark[i]); printf("\n"); } fclose(pfile); system("pause"); system("cls"); } //保存數(shù)據(jù) void SaveInfo() { for (int j = 0; j < g_count; j++) { for (int m = 0; m < 20; m++) { webSite[j][m] ^= 5; userName[j][m] ^= 5; passWord[j][m] ^= 5; reMark[j][m] ^= 5; } } FILE *pfile; if (fopen_s(&pfile, "data.i", "w") != 0) { printf("file open fail"); exit(1); } fseek(pfile, 0, SEEK_SET); fprintf(pfile, "當(dāng)前個(gè)數(shù)%d\n", g_count); for (int i = 0; i < g_count; i++) { fwrite(webSite[i], 20, 1, pfile); fwrite(userName[i], 20, 1, pfile); fwrite(passWord[i], 20, 1, pfile); fwrite(reMark[i], 20, 1, pfile); fprintf(pfile, "\n"); } fclose(pfile); } //刪除數(shù)據(jù) void DelInfo() { char aTemp[20]; int nFind = 0; int nIndex = 0; printf("請(qǐng)輸入要?jiǎng)h除的站點(diǎn):\n"); scanf_s("%s", aTemp, 20); for (; nIndex < g_count; nIndex++) { if (strcmp(aTemp, webSite[nIndex]) == 0) { nFind = 1; break; } } if (nFind == 1) { for (int i = nIndex; i < g_count; i++) { strcpy_s(webSite[i], 20, webSite[i + 1]); strcpy_s(userName[i], 20, userName[i + 1]); strcpy_s(passWord[i], 20, passWord[i + 1]); strcpy_s(reMark[i], 20, reMark[i + 1]); } g_count--; SaveInfo(); InitInfo(); printf("刪除成功\n"); } else { printf("查找失?。n"); } system("pause"); system("cls"); } //初始化數(shù)據(jù) void InitInfo() { FILE *pfile; if (fopen_s(&pfile, "data.i", "r") != 0) { printf("請(qǐng)先建立data.i文件!"); system("pause"); exit(1); } fscanf_s(pfile, "當(dāng)前個(gè)數(shù)%d\n", &g_count); for (int i = 0; i < g_count; i++) { fread(webSite[i], 20, 1, pfile); fread(userName[i], 20, 1, pfile); fread(passWord[i], 20, 1, pfile); fread(reMark[i], 20, 1, pfile); fscanf_s(pfile, "\n"); } for (int j = 0; j < g_count; j++) { for (int m = 0; m < 20; m++) { webSite[j][m] ^= 5; userName[j][m] ^= 5; passWord[j][m] ^= 5; reMark[j][m] ^= 5; } } fclose(pfile); } //查詢數(shù)據(jù) void FindInfo() { char aTemp[20]; int nFind = 0; printf("請(qǐng)輸入要查詢的站點(diǎn):\n"); scanf_s("%s", aTemp, 20); for (int nIndex = 0; nIndex < g_count; nIndex++) { if (strcmp(aTemp, webSite[nIndex]) == 0) { nFind = 1; } if (nFind == 1) { printf("站點(diǎn):%s,賬號(hào):%s,密碼:%s,備注:%s\n", webSite[nIndex], userName[nIndex], passWord[nIndex], reMark[nIndex]); break; } } if (nFind == 0) { printf("查找失?。n"); } system("pause"); system("cls"); } //修改數(shù)據(jù) void EditInfo() { char aTemp[20]; int nFind = 0; printf("請(qǐng)輸入要修改的站點(diǎn):\n"); scanf_s("%s", aTemp, 20); for (int nIndex = 0; nIndex < g_count; nIndex++) { if (strcmp(aTemp, webSite[nIndex]) == 0) { nFind = 1; } if (nFind == 1) { printf("輸入需要修改的 賬號(hào):"); scanf_s("%s", userName[nIndex], 20); printf("輸入需要修改的 密碼:"); scanf_s("%s", passWord[nIndex], 20); printf("輸入需要修改的 備注:"); scanf_s("%s", reMark[nIndex], 20); printf("站點(diǎn):%s,賬號(hào):%s,密碼:%s,備注:%s\n", webSite[nIndex], userName[nIndex], passWord[nIndex], reMark[nIndex]); SaveInfo(); break; } } if (nFind == 0) { printf("查找失??!\n"); } system("pause"); system("cls"); } //啟動(dòng)時(shí)輸入密碼 void StartPassWord() { char spw[10] = "abcd"; //程序的啟動(dòng)密碼 char write[10] = ""; int nSuccess = 0; for (int i = 1; i <= 3; i++) { printf("請(qǐng)輸入啟動(dòng)密碼:\n"); scanf_s("%s", write, 10); if (strcmp(write, spw) == 0) { nSuccess = 1; break; } else { printf("你的輸入有誤!還有%d次機(jī)會(huì)\n", 3 - i); system("pause"); system("cls"); } } if (nSuccess == 1) { printf("輸入正確!按任意鍵開始使用程序\n"); } else { printf("輸入全部錯(cuò)誤!按任意鍵結(jié)束程序\n"); system("pause"); exit(1); } system("pause"); system("cls"); }
5.關(guān)于加密
異或加密:異或是一種運(yùn)算方式,在C語(yǔ)言中是^符號(hào),通??梢杂糜诩用?。
例如項(xiàng)目中的實(shí)現(xiàn)
for (int j = 0; j < g_count; j++) { for (int m = 0; m < 20; m++) { webSite[j][m] ^= 5; userName[j][m] ^= 5; passWord[j][m] ^= 5; reMark[j][m] ^= 5; } }
四、總結(jié)
程序中還有很有缺陷,第一次寫博客,希望大家多多包涵!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳細(xì)解析命令行的getopt_long()函數(shù)
getopt_long支持長(zhǎng)選項(xiàng)的命令行解析,函數(shù)中的參數(shù)argc和argv通常直接從main()的兩個(gè)參數(shù)傳遞而來(lái)2013-09-09C語(yǔ)言結(jié)構(gòu)體詳細(xì)圖解分析
C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C 的結(jié)構(gòu)體2022-03-03Visual?Studio?2022?配置?PCL?1.12.1?的問(wèn)題小結(jié)
這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗(yàn)總結(jié)分享,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08