1. 程式人生 > >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, "data.i", "w") != 0)
	{
		printf("file open fail");
		exit(1);
	}
	fseek(pfile, 0, SEEK_SET);
	fprintf(pfile, "當前個數%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);
}

//刪除資料
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], 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");
}

//初始化資料
void InitInfo()
{
	FILE *pfile;
	if (fopen_s(&pfile, "data.i", "r") != 0)
	{
		printf("請先建立data.i檔案!");
		system("pause");
		exit(1);
	}
	fscanf_s(pfile, "當前個數%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);
}

//查詢資料
void FindInfo()
{
	char aTemp[20];
	int nFind = 0;

	printf("請輸入要查詢的站點:\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("站點:%s,賬號:%s,密碼:%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", aTemp, 20);
	for (int nIndex = 0; nIndex < g_count; nIndex++)
	{
		if (strcmp(aTemp, webSite[nIndex]) == 0)
		{
			nFind = 1;
		}
		if (nFind == 1)
		{
			printf("輸入需要修改的 賬號:");
			scanf_s("%s", userName[nIndex], 20);
			printf("輸入需要修改的 密碼:");
			scanf_s("%s", passWord[nIndex], 20);
			printf("輸入需要修改的 備註:");
			scanf_s("%s", reMark[nIndex], 20);
			printf("站點:%s,賬號:%s,密碼:%s,備註:%s\n",
				webSite[nIndex], userName[nIndex], passWord[nIndex], 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;
		}
	}

四、總結

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