zoukankan      html  css  js  c++  java
  • 密码本(无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("**************************欢迎使用密码本****************************
    ");
    22         printf("*                                                                *
    ");
    23         printf("*                ---------------------------------               *
    ");
    24         printf("*                    |    Powered By NoThx  |                    *
    ");
    25         printf("*                ---------------------------------               *
    ");
    26         printf("*                                                                *
    ");
    27         printf("*                         请输入你的选择                           *
    ");
    28         printf("*                           1)查看所有                            *
    ");
    29         printf("*                           2)新增密码                            *
    ");
    30         printf("*                           3)删除密码                            *
    ");
    31         printf("*                           4)修改密码                            *
    ");
    32         printf("*                           5)查询密码                            *
    ");
    33         printf("*                           6)生成文件                            *
    ");
    34         printf("*                           0)退出软件                            *
    ");
    35         printf("*                                                                *
    ");
    36         printf("******************************************************************
    ");
    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 条记录=====================
    ", nCount);
     15     for (int i = 0; i < nCount; i++)
     16     {
     17         printf("--ID:%3d---------------------
    ", i);
     18         printf("目标:%s 
    ", pwd[i].website);
     19         printf("用户名:%s 
    ", pwd[i].userName);
     20         printf("密码:%s 
    ", pwd[i].passWord);
     21         printf("备注: %s 
    ", pwd[i].note);
     22     }
     23 
     24     printf("
    ");
     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 
    ", i);
     36         return;
     37     }
     38     printf("请输入<目标站点>
    ");
     39     scanf_s("%s", pwd[i].website, 100);
     40     printf("请输入<用户名>
    ");
     41     scanf_s("%s", pwd[i].userName, 100);
     42     printf("请输入<密码>
    ");
     43     scanf_s("%s", pwd[i].passWord, 100);
     44     printf("请输入<备注信息>
    ");
     45     scanf_s("%s", pwd[i].note, 100);
     46 
     47     (*pnCount)++;
     48 
     49     SaveInfoB(pwd, *pnCount);
     50 
     51     printf("
    ");
     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>
    ");
     62     scanf_s("%d", &i);
     63     if (i < 0 || i >= NUM)
     64     {
     65         printf("删除位置异常:%d 
    ", 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("
    ");
     79     system("pause");
     80     system("cls");
     81 }
     82 
     83 //修改密码
     84 void alterInfo(PASSWORD pwd[], int nCount)
     85 {
     86     int i = -1;
     87     printf("请输入待修该项<密码ID>
    ");
     88     scanf_s("%d", &i);
     89     if (i < 0 || i >= NUM)
     90     {
     91         printf("修改位置异常:%d 
    ", i);
     92         return;
     93     }
     94 
     95         printf("--ID:%3d---------------------
    ", i);
     96         printf("目标:%s 
    ", pwd[i].website);
     97         printf("用户名:%s 
    ", pwd[i].userName);
     98         printf("密码:%s 
    ", pwd[i].passWord);
     99         printf("备注: %s 
    ", pwd[i].note);
    100         printf("~修改~
    ");
    101 
    102         printf("请输入<目标站点>
    ");
    103         scanf_s("%s", pwd[i].website, 100);
    104         printf("请输入<用户名>
    ");
    105         scanf_s("%s", pwd[i].userName, 100);
    106         printf("请输入<密码>
    ");
    107         scanf_s("%s", pwd[i].passWord, 100);
    108         printf("请输入<备注信息>
    ");
    109         scanf_s("%s", pwd[i].note, 100);
    110 
    111         SaveInfoB(pwd, nCount);
    112         
    113         printf("
    ");
    114         system("pause");
    115         system("cls");
    116 }
    117 
    118 //查询密码
    119 void searchInfo(PASSWORD pwd[], int nCount)
    120 {
    121     char key[100] = { 0 };
    122     printf("请输入查找密码的关键字:
    ");
    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 条记录===================
    ", nfindCount);
    154     for (int i = 0; i < nfindCount; i++)
    155     {
    156         int pos = findPwd[i];
    157         printf("--ID:%3d----------------------
    ", pos);
    158         printf("目标:%s 
    ", pwd[pos].website);
    159         printf("用户名:%s 
    ", pwd[pos].userName);
    160         printf("密码:%s 
    ", pwd[pos].passWord);
    161         printf("备注:%s 
    ", pwd[pos].note);
    162     }
    163 
    164     printf("
    ");
    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 条记录==================
    ", nCount);
    189     for (int i = 0; i < nCount; i++)
    190     {
    191         fprintf(pFile, "目标: %s 
    ", pwd[i].website);
    192         fprintf(pFile, "用户名: %s 
    ", pwd[i].userName);
    193         fprintf(pFile, "密码: %s 
    ", pwd[i].passWord);
    194         fprintf(pFile, "备注: %s 
    ", pwd[i].note);
    195     }
    196 
    197     // 关闭文件
    198     fclose(pFile);
    199     printf("保存文本密码成功,使用后请尽快删除!!
    ");
    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("写入密码文件错误
    ");
    232     }
    233     else
    234     {
    235         printf("成功!!
    ");
    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("读取密码文件错误 
    ");
    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 }

    运行结果如下:

  • 相关阅读:
    一句话说明分布式与集群的区别以及什么是分布式集群
    docker Unhandled exception: Filesharing has been cancelled
    sqlserver查询数据的所有表名和行数
    docker push失败:denied: requested access to the resource is denied
    windows docker 共享文件权限设置
    ubuntu 16.4 docker 镜像加速
    fastreport 旋转 竖排
    基于Huggingface使用BERT进行文本分类的fine-tuning
    基于Embedding深度学习算法综述
    机器学习基础知识
  • 原文地址:https://www.cnblogs.com/nothx/p/8532760.html
Copyright © 2011-2022 走看看