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