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

四、总结

程序中还有很有缺陷,第一次写博客,希望大家多多包涵!

猜你喜欢

转载自blog.csdn.net/wudao_MyWay/article/details/81085548