C语言实现密码本小项目

时间:2022-06-30 03:33:07

一、引言

学C语言有一段时间了,趁着正好做了密码本的小项目,把它分享出来。

二、思路与原理

密码本,见名知意,就是存放账号密码,起到备忘录作用的本子,将需要备忘的数据通过加密存放在文本文件中,打开的文本文件为加密文本,需要通过软件查看已经存放的数据,提高安全性。(软件设计了启动密码,三次过后自动退出)

项目目标:

  • 保存账号密码,退出后打开软件数据不丢失
  • 进行简单加密
  • 能按条件查找账号密码
  • 能修改账号密码数据
  • 能按条件进行删除数据

知识涉及到数组、文件操作的使用以及简单异或加密。

软件的部分截图如下:

C语言实现密码本小项目

主菜单

C语言实现密码本小项目

增加数据

C语言实现密码本小项目

删除数据

C语言实现密码本小项目

查询数据

C语言实现密码本小项目

全部数据

三、实现

1.头文件及数据定义

在密码本的小项目中我设立四个了存放数据的数组,所存放的账号密码的站点,存放的账号,存放的密码以及备注。定义了一个全局变量,用来计数当前密码本使用的条数。

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. //定义四个数组,用来存放站点、账号、密码、备注的值
  7. char webSite[100][20];
  8. char userName[100][20];
  9. char passWord[100][20];
  10. char reMark[100][20];
  11. //定义一个全局变量
  12. int g_count = 0;

2.程序的整体框架

  1. int main(void)
  2. {
  3. InitInfo();
  4. int nChoice = 1;
  5.  
  6. StartPassWord();
  7.  
  8. while (nChoice)
  9. {
  10. printf("*********************************欢迎使用密码本*********************************\n");
  11. printf(" 请输入以下选项进行操作: \n");
  12. printf(" 1、增加数据 \n");
  13. printf(" 2、删除数据 \n");
  14. printf(" 3、修改数据 \n");
  15. printf(" 4、查询数据 \n");
  16. printf(" 5、全部数据 \n");
  17. printf(" 6、结束程序 \n");
  18. printf("********************************************************************************\n");
  19. scanf_s("%d", &nChoice);
  20. switch (nChoice)
  21. {
  22. case 1:
  23. {
  24. AddInfo();//增加数据
  25. }break;
  26. case 2:
  27. {
  28. DelInfo(); //删除数据
  29. }break;
  30. case 3:
  31. {
  32. EditInfo();//修改数据
  33. }break;
  34. case 4:
  35. {
  36. FindInfo();//查询数据
  37. }break;
  38. case 5:
  39. {
  40. ReadAllInfo();//查看全部
  41. }break;
  42. case 6:
  43. {
  44. nChoice = 0;//退出程序
  45. }break;
  46. }
  47. }
  48. printf("欢迎下次使用!\n");
  49.  
  50. system("pause");
  51. return 0;
  52. }

3.函数的声明

  1. //启动时输入密码
  2. void StartPassWord();
  3. //增加数据
  4. void AddInfo();
  5. //删除数据
  6. void DelInfo();
  7. //修改数据
  8. void EditInfo();
  9. //查询数据
  10. void FindInfo();
  11. //读取全部数据
  12. void ReadAllInfo();
  13. //保存数据
  14. void SaveInfo();
  15. //初始化数据
  16. void InitInfo();

4.各个函数的实现

  1. //增加数据
  2. void AddInfo()
  3. {
  4. printf("输入需要存储的 站点:");
  5. scanf_s("%s", webSite[g_count], 20);
  6. printf("输入需要存储的 账号:");
  7. scanf_s("%s", userName[g_count], 20);
  8. printf("输入需要存储的 密码:");
  9. scanf_s("%s", passWord[g_count], 20);
  10. printf("输入需要存储的 备注:");
  11. scanf_s("%s", reMark[g_count], 20);
  12. g_count++;
  13. SaveInfo();
  14. InitInfo();
  15. system("pause");
  16. system("cls");
  17. }
  18.  
  19. //查看全部
  20. void ReadAllInfo()
  21. {
  22. FILE *pfile;
  23. if (fopen_s(&pfile, "data.i", "r") != 0)
  24. {
  25. printf("file open fail");
  26. exit(1);
  27. }
  28.  
  29. fscanf_s(pfile, "当前个数%d\n", &g_count);
  30. printf("当前有%d条数据\n", g_count);
  31. for (int i = 0; i < g_count; i++)
  32. {
  33. printf("第%d条数据:\n", i + 1);
  34. printf("站点:%s,账号:%s,密码:%s,备注:%s",
  35. webSite[i], userName[i], passWord[i], reMark[i]);
  36. printf("\n");
  37.  
  38. }
  39. fclose(pfile);
  40. system("pause");
  41. system("cls");
  42. }
  43.  
  44. //保存数据
  45. void SaveInfo()
  46. {
  47. for (int j = 0; j < g_count; j++)
  48. {
  49. for (int m = 0; m < 20; m++)
  50. {
  51. webSite[j][m] ^= 5;
  52. userName[j][m] ^= 5;
  53. passWord[j][m] ^= 5;
  54. reMark[j][m] ^= 5;
  55. }
  56. }
  57. FILE *pfile;
  58. if (fopen_s(&pfile, "data.i", "w") != 0)
  59. {
  60. printf("file open fail");
  61. exit(1);
  62. }
  63. fseek(pfile, 0, SEEK_SET);
  64. fprintf(pfile, "当前个数%d\n", g_count);
  65. for (int i = 0; i < g_count; i++)
  66. {
  67. fwrite(webSite[i], 20, 1, pfile);
  68. fwrite(userName[i], 20, 1, pfile);
  69. fwrite(passWord[i], 20, 1, pfile);
  70. fwrite(reMark[i], 20, 1, pfile);
  71. fprintf(pfile, "\n");
  72. }
  73. fclose(pfile);
  74. }
  75.  
  76. //删除数据
  77. void DelInfo()
  78. {
  79. char aTemp[20];
  80. int nFind = 0;
  81. int nIndex = 0;
  82. printf("请输入要删除的站点:\n");
  83. scanf_s("%s", aTemp, 20);
  84. for (; nIndex < g_count; nIndex++)
  85. {
  86. if (strcmp(aTemp, webSite[nIndex]) == 0)
  87. {
  88. nFind = 1;
  89. break;
  90. }
  91. }
  92. if (nFind == 1)
  93. {
  94. for (int i = nIndex; i < g_count; i++)
  95. {
  96. strcpy_s(webSite[i], 20, webSite[i + 1]);
  97. strcpy_s(userName[i], 20, userName[i + 1]);
  98. strcpy_s(passWord[i], 20, passWord[i + 1]);
  99. strcpy_s(reMark[i], 20, reMark[i + 1]);
  100. }
  101. g_count--;
  102. SaveInfo();
  103. InitInfo();
  104. printf("删除成功\n");
  105. }
  106. else
  107. {
  108. printf("查找失败!\n");
  109. }
  110. system("pause");
  111. system("cls");
  112. }
  113.  
  114. //初始化数据
  115. void InitInfo()
  116. {
  117. FILE *pfile;
  118. if (fopen_s(&pfile, "data.i", "r") != 0)
  119. {
  120. printf("请先建立data.i文件!");
  121. system("pause");
  122. exit(1);
  123. }
  124. fscanf_s(pfile, "当前个数%d\n", &g_count);
  125. for (int i = 0; i < g_count; i++)
  126. {
  127.  
  128. fread(webSite[i], 20, 1, pfile);
  129. fread(userName[i], 20, 1, pfile);
  130. fread(passWord[i], 20, 1, pfile);
  131. fread(reMark[i], 20, 1, pfile);
  132. fscanf_s(pfile, "\n");
  133. }
  134. for (int j = 0; j < g_count; j++)
  135. {
  136. for (int m = 0; m < 20; m++)
  137. {
  138. webSite[j][m] ^= 5;
  139. userName[j][m] ^= 5;
  140. passWord[j][m] ^= 5;
  141. reMark[j][m] ^= 5;
  142. }
  143. }
  144. fclose(pfile);
  145. }
  146.  
  147. //查询数据
  148. void FindInfo()
  149. {
  150. char aTemp[20];
  151. int nFind = 0;
  152.  
  153. printf("请输入要查询的站点:\n");
  154. scanf_s("%s", aTemp, 20);
  155. for (int nIndex = 0; nIndex < g_count; nIndex++)
  156. {
  157. if (strcmp(aTemp, webSite[nIndex]) == 0)
  158. {
  159. nFind = 1;
  160. }
  161. if (nFind == 1)
  162. {
  163. printf("站点:%s,账号:%s,密码:%s,备注:%s\n",
  164. webSite[nIndex], userName[nIndex], passWord[nIndex], reMark[nIndex]);
  165. break;
  166. }
  167. }
  168. if (nFind == 0)
  169. {
  170. printf("查找失败!\n");
  171. }
  172. system("pause");
  173. system("cls");
  174. }
  175.  
  176. //修改数据
  177. void EditInfo()
  178. {
  179. char aTemp[20];
  180. int nFind = 0;
  181.  
  182. printf("请输入要修改的站点:\n");
  183. scanf_s("%s", aTemp, 20);
  184. for (int nIndex = 0; nIndex < g_count; nIndex++)
  185. {
  186. if (strcmp(aTemp, webSite[nIndex]) == 0)
  187. {
  188. nFind = 1;
  189. }
  190. if (nFind == 1)
  191. {
  192. printf("输入需要修改的 账号:");
  193. scanf_s("%s", userName[nIndex], 20);
  194. printf("输入需要修改的 密码:");
  195. scanf_s("%s", passWord[nIndex], 20);
  196. printf("输入需要修改的 备注:");
  197. scanf_s("%s", reMark[nIndex], 20);
  198. printf("站点:%s,账号:%s,密码:%s,备注:%s\n",
  199. webSite[nIndex], userName[nIndex], passWord[nIndex], reMark[nIndex]);
  200. SaveInfo();
  201. break;
  202. }
  203. }
  204. if (nFind == 0)
  205. {
  206. printf("查找失败!\n");
  207. }
  208. system("pause");
  209. system("cls");
  210. }
  211.  
  212. //启动时输入密码
  213. void StartPassWord()
  214. {
  215. char spw[10] = "abcd"; //程序的启动密码
  216. char write[10] = "";
  217. int nSuccess = 0;
  218.  
  219. for (int i = 1; i <= 3; i++)
  220. {
  221. printf("请输入启动密码:\n");
  222. scanf_s("%s", write, 10);
  223. if (strcmp(write, spw) == 0)
  224. {
  225. nSuccess = 1;
  226. break;
  227. }
  228. else
  229. {
  230. printf("你的输入有误!还有%d次机会\n", 3 - i);
  231. system("pause");
  232. system("cls");
  233. }
  234. }
  235. if (nSuccess == 1)
  236. {
  237. printf("输入正确!按任意键开始使用程序\n");
  238. }
  239. else
  240. {
  241. printf("输入全部错误!按任意键结束程序\n");
  242. system("pause");
  243. exit(1);
  244. }
  245. system("pause");
  246. system("cls");
  247. }

5.关于加密

异或加密:异或是一种运算方式,在C语言中是^符号,通常可以用于加密。

例如项目中的实现

  1. for (int j = 0; j < g_count; j++)
  2. {
  3. for (int m = 0; m < 20; m++)
  4. {
  5. webSite[j][m] ^= 5;
  6. userName[j][m] ^= 5;
  7. passWord[j][m] ^= 5;
  8. reMark[j][m] ^= 5;
  9. }
  10. }

四、总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/wudao_MyWay/article/details/81085548