一、引言
学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;
- }
- }
四、总结
程序中还有很有缺陷,第一次写博客,希望大家多多包涵!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
原文链接:https://blog.csdn.net/wudao_MyWay/article/details/81085548