1 <data.h>
2
3 #pragma once
4
5 // 全局变量,常量的声明
6 #define NUM 100 // 密码最大长度
7 extern int g_nNum;
8
9
10
11 // 定义存储账号密码的结构体
12 typedef struct _PASSWORD
13 {
14 char website[100]; // 站点名
15 char username[100]; // 用户名
16 char passWord[100]; // 密码
17 char note[100]; // 备注
18 }PASSWORD, *PPASSWORD;
1 <data.c>
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include "data.h"
6
7 // 定义全局变量
8 int g_nNum;
1 <ctrl.h>
2
3 #pragma once
4 #include "data.h"
5 // 查看所有密码
6 void searchAllInfo(PASSWORD pwd[], int nCount);
7
8 // 新增密码
9 void insertInfo(PASSWORD pwd[], int * pnCount);
10
11 // 删除密码
12 void deleteInfo(PASSWORD pwd[], int *pnCount);
13
14 // 修改密码
15 void changInfo(PASSWORD pwd[], int nCount);
16
17 // 查询密码
18 void searchInfo(PASSWORD pwd[], int nCount);
19
20 // 保存密码(文本方式)
21 void saveInfoText(PASSWORD pwd[], int nCount);
22
23 // 保存密码(二进制)
24 void saveInfoBin(PASSWORD pwd[], int nCount);
25
26 // 从本地文件中读取密码,用于初始化密码本
27 void initialInfo(PPASSWORD * ppPwd, int * pnCount);
1 <ctrl.c>
2
3 #define _CRT_SECURE_NO_WARNINGS
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include "ctrl.h"
8 #include "data.h"
9
10 // 查看所有密码
11 void searchAllInfo(PASSWORD pwd[], int nCount)
12 {
13 printf("==共计匹配: %3d 条记录==============\n", nCount);
14 for (size_t i = 0; i < nCount; i++)
15 {
16
17 printf("目 标: %s \n", pwd[i].website);
18 printf("用户名: %s \n", pwd[i].username);
19 printf("密 码: %s \n", pwd[i].passWord);
20 printf("备 注: %s \n", pwd[i].note);
21 }
22
23 printf("\n");
24 system("pause");
25 system("cls");
26
27 }
28
29 // 新增数据
30 void insertInfo(PASSWORD pwd[], int * pnCount)
31 {
32 int i = *pnCount;
33 if (i < 0 || i >= NUM);
34 {
35 printf("插入位置异常:%d \n", i);
36 return;
37 }
38 printf("请输入<目标站点>\n");
39 scanf("%s", pwd[i].website);
40 printf("请输入< 用户名 >\n");
41 scanf("%s", pwd[i].username);
42 printf("请输入< 密码 >\n");
43 scanf("%s", pwd[i].passWord);
44 printf("请输入< 备注 >\n");
45 printf("%s", pwd[i].note);
46
47 (*pnCount)++;
48
49 saveInfoText(pwd, *pnCount);
50
51 printf("\n");
52 system("pause");
53 system("cls");
54 }
55
56 // 删除密码
57 void deleteInfo(PASSWORD pwd[], int *pnCount)
58 {
59 int i = -1;
60 printf("请输入待删除项<密码ID>\n");
61 scanf("%d", &i);
62 if (i < 0 || i >= NUM)
63 {
64 printf("删除位置异常: %d \n", i);
65 return;
66 }
67
68 for (size_t j = i; j < *pnCount - 1; j++)
69 {
70 pwd[j] = pwd[j + 1];
71 }
72
73 (*pnCount)--;
74
75 saveInfoBin(pwd, *pnCount);
76
77 printf("\n");
78 system("pause");
79 system("cls");
80 }
81
82 // 修改密码
83 void changInfo(PASSWORD pwd[], int nCount)
84 {
85 int i = -1;
86 printf("请输入待修该项<密码ID>\n");
87 scanf("%d", &i);
88 if (i < 0 || i >= NUM)
89 {
90 printf("修改位置异常:%d \n", i);
91 return;
92 }
93 printf("请输入<目标站点>\n");
94 scanf("%s", pwd[i].website);
95 printf("请输入< 用户名 >\n");
96 scanf("%s", pwd[i].username);
97 printf("请输入< 密码 >\n");
98 scanf("%s", pwd[i].passWord);
99 printf("请输入< 备注 >\n");
100 printf("%s", pwd[i].note);
101
102 saveInfoBin(pwd, nCount);
103
104 printf("\n");
105 system("pause");
106 system("cls");
107 }
108
109 // 查询密码
110 void searchInfo(PASSWORD pwd[], int nCount)
111 {
112 char key[100] = { 0 };
113 printf("请输入查找密码的关键字:\n");
114 scanf(key, 100);
115
116 // 找出所有匹配项
117 int findPwd[100] = { 0 };
118 int nfindCount = 0;
119 for (size_t i = 0; i < nCount; i++)
120 {
121 if (strstr(pwd[i].website, key))
122 {
123 findPwd[nfindCount++] = i;
124 continue;
125 }
126 if (strstr(pwd[i].username, key))
127 {
128 findPwd[nfindCount++] = i;
129 continue;
130 }
131 if (strstr(pwd[i].passWord, key))
132 {
133 findPwd[nfindCount++] = i;
134 continue;
135 }
136 if (strstr(pwd[i].note, key ))
137 {
138 findPwd[nfindCount++] = i;
139 continue;
140 }
141 }
142
143 // 打印所有匹配项
144 printf("==共计匹配: %3d 条记录==============\n", nfindCount);
145 for (size_t i = 0; i < nfindCount; i++)
146 {
147 int pos = findPwd[i];
148 printf("目 标: %s \n", pwd[pos].website);
149 printf("用户名: %s \n", pwd[pos].username);
150 printf("密 码: %s \n", pwd[pos].passWord);
151 printf("备 注: %s \n", pwd[pos].note);
152 }
153
154 printf("\n");
155 system("pause");
156 system("cls");
157 }
158
159 // 保存密码(文本方式)
160 void saveInfoText(PASSWORD pwd[], int nCount)
161 {
162 /*
163 1. 打开文件
164 2. 读写文件
165 3. 关闭文件
166 */
167 FILE *pf = NULL;
168 fopen("data.txt", "w");
169 if (feof(pf))
170 {
171 return;
172 }
173 fprintf(pf, "==共计:%3d条记录==================\n", nCount);
174 for (int i = 0; i < nCount; i++)
175 {
176 fprintf(pf, "--ID: %3d---------------\n", i);
177 fprintf(pf, "目 标: %s \n", pwd[i].website);
178 fprintf(pf, "用户名: %s \n", pwd[i].username);
179 fprintf(pf, "密 码: %s \n", pwd[i].passWord);
180 fprintf(pf, "备 注: %s \n", pwd[i].note);
181 }
182
183 fclose(pf);
184
185 printf("保存文本密码成功,使用后请尽快删除!! \n");
186 system("pause");
187 system("cls");
188 }
189
190 // 保存密码(二进制)
191 void saveInfoBin(PASSWORD pwd[], int nCount)
192 {
193 // 打开文件
194 FILE * pf = NULL;
195 fopen("data.i", "wb");
196
197 if (feof(pf))
198 {
199 return;
200 }
201
202 // 读写文件
203 fwrite(&nCount, sizeof(nCount), 1, pf); // 当前密码个数
204 fwrite(&g_nNum, sizeof(g_nNum), 1, pf); // 当前密码本容量
205
206 // 先加密(使用中间文件),再存储
207 int byteSize = sizeof(PASSWORD) * g_nNum;
208 char * buf = (char *)malloc(byteSize);
209 memcpy(buf, pwd, byteSize);
210
211 for (size_t i = 0; i < byteSize; i++)
212 {
213 buf[i] ^= (i + nCount + g_nNum); // 加密
214 }
215
216 size_t rlen = fwrite(buf, sizeof(PASSWORD), g_nNum, pf); // 密码数组
217 if (rlen != g_nNum)
218 {
219 printf("写入密码文件错误 \n");
220 }
221 else
222 {
223 printf("成功!!\n");
224 }
225
226 // 关闭文件
227 fclose(pf);
228 free(buf);
229 }
230
231 // 从本地文件中读取密码,用于初始化密码本
232 void initialInfo(PPASSWORD * ppPwd, int * pnCount)
233 {
234 // 打开文件
235 FILE *pf = NULL;
236 fopen("data.i", "rb");
237 if (!feof(pf));
238 {
239 *ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD) * NUM);
240 g_nNum = NUM;
241 return;
242 }
243
244 // 读写文件
245 // 先读取,再解密
246 fread(pnCount, sizeof(int), 1, pf); // 当前密码个数
247 fread(&g_nNum, sizeof(g_nNum), 1, pf); // 当前密码本容量
248 *ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD)*g_nNum);
249 size_t rlen = fread(*ppPwd, sizeof(PPASSWORD), g_nNum, pf); // 密码数组
250 if (rlen != g_nNum)
251 {
252 printf("读取密码文件错误\n");
253 fclose(pf);
254 return;
255 }
256 int byteSize = sizeof(PASSWORD) * g_nNum;
257 char * buf = (char *)*ppPwd;
258 for (size_t i = 0; i < byteSize; i++)
259 {
260 buf[i] ^= (i + *pnCount + g_nNum);
261 }
262
263 // 关闭文件
264 fclose(pf);
265 }
1 <main.c>
2
3 #define _CRT_SECURE_NO_WARNINGS
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include "data.h"
7 #include "ctrl.h"
8
9 int printMenu(); // 声明
10
11 int main()
12 {
13 PPASSWORD pPwd = 0; // 密码结构体数组
14 int nCount = 0; // 当前密码个数
15 g_nNum = 0; // 当前密码本容量
16
17 int menuID;
18
19 while (1)
20 {
21 menuID = printMenu();
22
23 switch (menuID)
24 {
25 case 1: searchAllInfo(pPwd, nCount); break;
26 case 2: insertInfo(pPwd, &nCount); break;
27 case 3: deleteInfo(pPwd, &nCount); break;
28 case 4: changInfo(pPwd, nCount); break;
29 case 5: searchInfo(pPwd, nCount); break;
30 case 6: saveInfoText(pPwd, nCount); break;
31 case 7: saveInfoBin(pPwd, nCount); break;
32 }
33
34 }
35
36
37 return 0;
38 }
39
40
41 // 打印主菜单
42 int printMenu()
43 {
44 int menuID;
45 printf("**************************欢迎使用密码本**************************\n");
46 printf("* *\n");
47 printf("* --------------------------------- *\n");
48 printf("* | Powered By NoThx | *\n");
49 printf("* --------------------------------- *\n");
50 printf("* *\n");
51 printf("* *\n");
52 printf("* 1)查看所有的密码 *\n");
53 printf("* 2)新增密码 *\n");
54 printf("* 3)删除密码 *\n");
55 printf("* 4)修改密码 *\n");
56 printf("* 5)查询密码 *\n");
57 printf("* 6)保存密码(文本方式) *\n");
58 printf("* 7)保存密码(二进制方式) *\n");
59 printf("* *\n");
60 printf("******************************************************************\n");
61
62
63 scanf("%d", &menuID);
64 return menuID;
65
66 }