密码本(初版),求指正

 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 条记录==============
", nCount);
 14     for (size_t i = 0; i < nCount; i++)
 15     {
 16         
 17         printf("目  标: %s  
", pwd[i].website);
 18         printf("用户名: %s 
", pwd[i].username);
 19         printf("密  码: %s 
", pwd[i].passWord);
 20         printf("备  注: %s 
", pwd[i].note);
 21     }
 22 
 23     printf("
");
 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 
", i);
 36         return;
 37     }
 38     printf("请输入<目标站点>
");
 39     scanf("%s", pwd[i].website);
 40     printf("请输入< 用户名 >
");
 41     scanf("%s", pwd[i].username);
 42     printf("请输入< 密码 >
");
 43     scanf("%s", pwd[i].passWord);
 44     printf("请输入< 备注 >
");
 45     printf("%s", pwd[i].note);
 46 
 47     (*pnCount)++;
 48 
 49     saveInfoText(pwd, *pnCount);
 50 
 51     printf("
");
 52     system("pause");
 53     system("cls");
 54 }
 55 
 56 // 删除密码
 57 void deleteInfo(PASSWORD pwd[], int *pnCount)
 58 {
 59     int i = -1;
 60     printf("请输入待删除项<密码ID>
");
 61     scanf("%d", &i);
 62     if (i < 0 || i >= NUM)
 63     {
 64         printf("删除位置异常: %d 
", 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("
");
 78     system("pause");
 79     system("cls");
 80 }
 81 
 82 // 修改密码
 83 void changInfo(PASSWORD pwd[], int nCount)
 84 {
 85     int i = -1;
 86     printf("请输入待修该项<密码ID>
");
 87     scanf("%d", &i);
 88     if (i < 0 || i >= NUM)
 89     {
 90         printf("修改位置异常:%d 
", i);
 91         return;
 92     }
 93     printf("请输入<目标站点>
");
 94     scanf("%s", pwd[i].website);
 95     printf("请输入< 用户名 >
");
 96     scanf("%s", pwd[i].username);
 97     printf("请输入< 密码 >
");
 98     scanf("%s", pwd[i].passWord);
 99     printf("请输入< 备注 >
");
100     printf("%s", pwd[i].note);
101 
102     saveInfoBin(pwd, nCount);
103 
104     printf("
");
105     system("pause");
106     system("cls");
107 }
108 
109 // 查询密码
110 void searchInfo(PASSWORD pwd[], int nCount)
111 {
112     char key[100] = { 0 };
113     printf("请输入查找密码的关键字:
");
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 条记录==============
", nfindCount);
145     for (size_t i = 0; i < nfindCount; i++)
146     {
147         int pos = findPwd[i];
148         printf("目  标: %s  
", pwd[pos].website);
149         printf("用户名: %s 
", pwd[pos].username);
150         printf("密  码: %s 
", pwd[pos].passWord);
151         printf("备  注: %s 
", pwd[pos].note);
152     }
153     
154     printf("
");
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条记录==================
", nCount);
174     for (int i = 0; i < nCount; i++)
175     {
176         fprintf(pf, "--ID: %3d---------------
", i);
177         fprintf(pf, "目  标: %s  
", pwd[i].website);
178         fprintf(pf, "用户名: %s 
", pwd[i].username);
179         fprintf(pf, "密  码: %s 
", pwd[i].passWord);
180         fprintf(pf, "备  注: %s 
", pwd[i].note);
181     }
182     
183     fclose(pf);
184 
185     printf("保存文本密码成功,使用后请尽快删除!! 
");
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("写入密码文件错误 
");
220     }
221     else
222     {
223         printf("成功!!
");
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("读取密码文件错误
");
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("**************************欢迎使用密码本**************************
");
46     printf("*                                                                *
");
47     printf("*                ---------------------------------               *
");
48     printf("*                    |     Powered By NoThx  |                   *
");
49     printf("*                ---------------------------------               *
");
50     printf("*                                                                *
");
51     printf("*                                                                *
");
52     printf("*                1)查看所有的密码                                *
");
53     printf("*                2)新增密码                                      *
");
54     printf("*                3)删除密码                                      *
");
55     printf("*                4)修改密码                                      *
");
56     printf("*                5)查询密码                                      *
");
57     printf("*                6)保存密码(文本方式)                            *
");
58     printf("*                7)保存密码(二进制方式)                          *
");
59     printf("*                                                                *
");
60     printf("******************************************************************
");
61     
62 
63     scanf("%d", &menuID);
64     return menuID;
65 
66 }
原文地址:https://www.cnblogs.com/nothx/p/8523070.html