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

C語言實現密碼本小專案

一、引言

學C語言有一段時間了,趁著正好做了密碼本的小專案,把它分享出來。

二、思路與原理

密碼本,見名知意,就是存放賬號密碼,起到備忘錄作用的本子,將需要備忘的資料通過加密存放在文字檔案中,開啟的文字檔案為加密文字,需要通過軟體檢視已經存放的資料,提高安全性。(軟體設計了啟動密碼,三次過後自動退出)

專案目標:

  • 儲存賬號密碼,退出後開啟軟體資料不丟失
  • 進行簡單加密
  • 能按條件查詢賬號密碼
  • 能修改賬號密碼資料
  • 能按條件進行刪除資料

知識涉及到陣列、檔案操作的使用以及簡單異或加密。

軟體的部分截圖如下:

C語言實現密碼本小專案

主選單

C語言實現密碼本小專案

增加資料

C語言實現密碼本小專案

刪除資料

C語言實現密碼本小專案

查詢資料

C語言實現密碼本小專案

全部資料

三、實現

1.標頭檔案及資料定義

在密碼本的小專案中我設立四個了存放資料的陣列,所存放的賬號密碼的站點,存放的賬號,存放的密碼以及備註。定義了一個全域性變數,用來計數當前密碼本使用的條數。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
//定義四個陣列,用來存放站點、賬號、密碼、備註的值
char webSite[100][20];
char userName[100][20];
char passWord[100][20];
char reMark[100][20];
//定義一個全域性變數
int g_count = 0;

2.程式的整體框架

int main(void)
{
 InitInfo();
 int nChoice = 1;
 
 StartPassWord();
 
 while (nChoice)
 {
 printf("*********************************歡迎使用密碼本*********************************\n");
 printf("               請輸入以下選項進行操作:              \n");
 printf("                 1、增加資料                  \n");
 printf("                 2、刪除資料                  \n");
 printf("                 3、修改資料                  \n");
 printf("                 4、查詢資料                  \n");
 printf("                 5、全部資料                  \n");
 printf("                 6、結束程式                  \n");
 printf("********************************************************************************\n");
 scanf_s("%d",&nChoice);
 switch (nChoice)
 {
 case 1:
 {
  AddInfo();//增加資料 
 }break;
 case 2:
 {
  DelInfo(); //刪除資料
 }break;
 case 3:
 {
  EditInfo();//修改資料
 }break;
 case 4:
 {
  FindInfo();//查詢資料
 }break;
 case 5:
 {
  ReadAllInfo();//檢視全部
 }break;
 case 6:
 {
  nChoice = 0;//退出程式
 }break;
 }
 }
 printf("歡迎下次使用!\n");
 
 system("pause");
 return 0;
}

3.函式的宣告

//啟動時輸入密碼
void StartPassWord();
//增加資料
void AddInfo();
//刪除資料
void DelInfo();
//修改資料
void EditInfo();
//查詢資料
void FindInfo();
//讀取全部資料
void ReadAllInfo();
//儲存資料
void SaveInfo();
//初始化資料
void InitInfo();

4.各個函式的實現

//增加資料
void AddInfo()
{
 printf("輸入需要儲存的 站點:");
 scanf_s("%s",webSite[g_count],20);
 printf("輸入需要儲存的 賬號:");
 scanf_s("%s",userName[g_count],20);
 printf("輸入需要儲存的 密碼:");
 scanf_s("%s",passWord[g_count],20);
 printf("輸入需要儲存的 備註:");
 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\n",&g_count);
 printf("當前有%d條資料\n",g_count);
 for (int i = 0; i < g_count; i++)
 {
 printf("第%d條資料:\n",i + 1);
 printf("站點:%s,賬號:%s,密碼:%s,備註:%s",webSite[i],userName[i],passWord[i],reMark[i]);
 printf("\n");
 
 }
 fclose(pfile);
 system("pause");
 system("cls");
}
 
//儲存資料
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,"w") != 0)
 {
 printf("file open fail");
 exit(1);
 }
 fseek(pfile,SEEK_SET);
 fprintf(pfile,g_count);
 for (int i = 0; i < g_count; i++)
 {
 fwrite(webSite[i],20,1,pfile);
 fwrite(userName[i],pfile);
 fwrite(passWord[i],pfile);
 fwrite(reMark[i],pfile);
 fprintf(pfile,"\n");
 }
 fclose(pfile);
}
 
//刪除資料
void DelInfo()
{
 char aTemp[20];
 int nFind = 0;
 int nIndex = 0;
 printf("請輸入要刪除的站點:\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],webSite[i + 1]);
  strcpy_s(userName[i],userName[i + 1]);
  strcpy_s(passWord[i],passWord[i + 1]);
  strcpy_s(reMark[i],reMark[i + 1]);
 }
 g_count--;
 SaveInfo();
 InitInfo();
 printf("刪除成功\n");
 }
 else
 {
 printf("查詢失敗!\n");
 }
 system("pause");
 system("cls");
}
 
//初始化資料
void InitInfo()
{
 FILE *pfile;
 if (fopen_s(&pfile,"r") != 0)
 {
 printf("請先建立data.i檔案!");
 system("pause");
 exit(1);
 }
 fscanf_s(pfile,&g_count);
 for (int i = 0; i < g_count; i++)
 {
 
 fread(webSite[i],pfile);
 fread(userName[i],pfile);
 fread(passWord[i],pfile);
 fread(reMark[i],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);
}
 
//查詢資料
void FindInfo()
{
 char aTemp[20];
 int nFind = 0;
 
 printf("請輸入要查詢的站點:\n");
 scanf_s("%s",20);
 for (int nIndex = 0; nIndex < g_count; nIndex++)
 {
 if (strcmp(aTemp,webSite[nIndex]) == 0)
 {
  nFind = 1;
 }
 if (nFind == 1)
 {
  printf("站點:%s,備註:%s\n",webSite[nIndex],userName[nIndex],passWord[nIndex],reMark[nIndex]);
  break;
 }
 }
 if (nFind == 0)
 {
 printf("查詢失敗!\n");
 }
 system("pause");
 system("cls");
}
 
//修改資料
void EditInfo()
{
 char aTemp[20];
 int nFind = 0;
 
 printf("請輸入要修改的站點:\n");
 scanf_s("%s",webSite[nIndex]) == 0)
 {
  nFind = 1;
 }
 if (nFind == 1)
 {
  printf("輸入需要修改的 賬號:");
  scanf_s("%s",20);
  printf("輸入需要修改的 密碼:");
  scanf_s("%s",20);
  printf("輸入需要修改的 備註:");
  scanf_s("%s",reMark[nIndex],20);
  printf("站點:%s,reMark[nIndex]);
  SaveInfo();
  break;
 }
 }
 if (nFind == 0)
 {
 printf("查詢失敗!\n");
 }
 system("pause");
 system("cls");
}
 
//啟動時輸入密碼
void StartPassWord()
{
 char spw[10] = "abcd"; //程式的啟動密碼
 char write[10] = "";
 int nSuccess = 0;
 
 for (int i = 1; i <= 3; i++)
 {
 printf("請輸入啟動密碼:\n");
 scanf_s("%s",write,10);
 if (strcmp(write,spw) == 0)
 {
  nSuccess = 1;
  break;
 }
 else
 {
  printf("你的輸入有誤!還有%d次機會\n",3 - i);
  system("pause");
  system("cls");
 }
 }
 if (nSuccess == 1)
 {
 printf("輸入正確!按任意鍵開始使用程式\n");
 }
 else
 {
 printf("輸入全部錯誤!按任意鍵結束程式\n");
 system("pause");
 exit(1);
 }
 system("pause");
 system("cls");
}

5.關於加密

異或加密:異或是一種運算方式,在C語言中是^符號,通常可以用於加密。

例如專案中的實現

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

四、總結

程式中還有很有缺陷,第一次寫部落格,希望大家多多包涵!

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