密码本(初版),求指正
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 }