密码本(无bug版)
main.cpp #include <stdio.h>
#include <stdlib.h>
#include "data.h"
#include "ctrl.h" int main()
{
PPASSWORD pPwd = nullptr; // 密码数组
int nCount = ; // 当前密码个数
g_nNum = ; // 当前密码本容量 readInfo(&pPwd, &nCount); // 从本地文件中读取密码,用于初始化密码本 while (true)
{
system("title 欢迎使用密码本");
system("color 0E");
printf("**************************欢迎使用密码本****************************\n");
printf("* *\n");
printf("* --------------------------------- *\n");
printf("* | Powered By NoThx | *\n");
printf("* --------------------------------- *\n");
printf("* *\n");
printf("* 请输入你的选择 *\n");
printf("* 1)查看所有 *\n");
printf("* 2)新增密码 *\n");
printf("* 3)删除密码 *\n");
printf("* 4)修改密码 *\n");
printf("* 5)查询密码 *\n");
printf("* 6)生成文件 *\n");
printf("* 0)退出软件 *\n");
printf("* *\n");
printf("******************************************************************\n"); OPTION op;
scanf_s("%d", &op); switch (op)
{
case 查看所有:
searchAllInfo(pPwd, nCount);
break;
case 新增:
insertInfo(pPwd, &nCount);
break;
case 删除:
deleteInfo(pPwd, &nCount);
break;
case 修改:
alterInfo(pPwd, nCount);
break;
case 查询:
searchInfo(pPwd, nCount);
break;
case 保存文本:
SaveInfoA(pPwd, nCount);
break;
case 退出软件:
exit();
break;
default:
break;
}
} return ; }
data.h #pragma once //#define PWD_LEN 20 //密码最大长度 // 自定义数据类型
//定义所有的用户操作为枚举
enum OPTION {
#define 退出软件 0
#define 查看所有 1
#define 新增 2
#define 删除 3
#define 修改 4
#define 查询 5
#define 保存文本 6
#define 保存二进制 7
}; // 定义存储账号密码的结构体
typedef struct _PASSWORD
{
char website[]; // 站点名
char userName[]; // 用户名
char passWord[]; // 密码
char note[]; // 备注
}PASSWORD, *PPASSWORD; // 全局变量, 常量的声明
#define NUM 100 // 初始密码本的容量
extern int g_nNum; // 当前密码本容量
data.cpp #include "data.h" // 全局变量的定义
int g_nNum;
ctrl.h #pragma once //查看所有密码
void searchAllInfo(PASSWORD pwd[], int nCount); //新增密码
void insertInfo(PASSWORD pwd[], int *pnCount); //删除密码
void deleteInfo(PASSWORD pwd[], int * pnCount); //修改密码
void alterInfo(PASSWORD pwd[], int nCount); //查询密码
void searchInfo(PASSWORD pwd[], int nCount); // 保存密码(文本方式)
void SaveInfoA(PASSWORD pwd[], int nCount); //保存密码(二进制的方式)
void SaveInfoB(PASSWORD pwd[], int nCount); //从本地文件中读取密码,用于初始化密码本
void readInfo(PPASSWORD *ppPwd, int * pnCount);// 传递指针是因为希望函数在内部改变这个变量的值
ctrl.cpp #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "data.h" // 函数声明,否则保存不可用
void SaveInfoB(PASSWORD pwd[], int nCount); //查看所有密码
void searchAllInfo(PASSWORD pwd[], int nCount)
{
printf("==共计:%3d 条记录=====================\n", nCount);
for (int i = ; i < nCount; i++)
{
printf("--ID:%3d---------------------\n", i);
printf("目标:%s \n", pwd[i].website);
printf("用户名:%s \n", pwd[i].userName);
printf("密码:%s \n", pwd[i].passWord);
printf("备注: %s \n", pwd[i].note);
} printf("\n");
system("pause");
system("cls");
} //新增密码
void insertInfo(PASSWORD pwd[], int *pnCount)
{
int i = *pnCount;
if (i < || i >= NUM)
{
printf("插入位置异常:%d \n", i);
return;
}
printf("请输入<目标站点>\n");
scanf_s("%s", pwd[i].website, );
printf("请输入<用户名>\n");
scanf_s("%s", pwd[i].userName, );
printf("请输入<密码>\n");
scanf_s("%s", pwd[i].passWord, );
printf("请输入<备注信息>\n");
scanf_s("%s", pwd[i].note, ); (*pnCount)++; SaveInfoB(pwd, *pnCount); printf("\n");
system("pause");
system("cls"); } //删除密码
void deleteInfo(PASSWORD pwd[], int * pnCount)
{
int i = -;
printf("请输入待删除项<密码ID>\n");
scanf_s("%d", &i);
if (i < || i >= NUM)
{
printf("删除位置异常:%d \n", i);
return;
} for (int j = i; j < *pnCount - ; j++)
{
pwd[j] = pwd[j + ];
} (*pnCount)--; SaveInfoB(pwd, *pnCount); printf("\n");
system("pause");
system("cls");
} //修改密码
void alterInfo(PASSWORD pwd[], int nCount)
{
int i = -;
printf("请输入待修该项<密码ID>\n");
scanf_s("%d", &i);
if (i < || i >= NUM)
{
printf("修改位置异常:%d \n", i);
return;
} printf("--ID:%3d---------------------\n", i);
printf("目标:%s \n", pwd[i].website);
printf("用户名:%s \n", pwd[i].userName);
printf("密码:%s \n", pwd[i].passWord);
printf("备注: %s \n", pwd[i].note);
printf("~修改~\n"); printf("请输入<目标站点>\n");
scanf_s("%s", pwd[i].website, );
printf("请输入<用户名>\n");
scanf_s("%s", pwd[i].userName, );
printf("请输入<密码>\n");
scanf_s("%s", pwd[i].passWord, );
printf("请输入<备注信息>\n");
scanf_s("%s", pwd[i].note, ); SaveInfoB(pwd, nCount); printf("\n");
system("pause");
system("cls");
} //查询密码
void searchInfo(PASSWORD pwd[], int nCount)
{
char key[] = { };
printf("请输入查找密码的关键字:\n");
scanf_s("%s", key, ); // 找出所有匹配项
int findPwd[] = { };
int nfindCount = ;
for (int i = ; i < nCount; i++)
{
if (strstr(pwd[i].website, key))
{
findPwd[nfindCount++] = i;
continue;
}
if (strstr(pwd[i].userName, key))
{
findPwd[nfindCount++] = i;
continue;
}
if (strstr(pwd[i].passWord, key))
{
findPwd[nfindCount++] = i;
continue;
}
if (strstr(pwd[i].note, key))
{
findPwd[nfindCount++] = i;
continue;
}
} //打印所有匹配项
printf("==共计匹配:%3d 条记录===================\n", nfindCount);
for (int i = ; i < nfindCount; i++)
{
int pos = findPwd[i];
printf("--ID:%3d----------------------\n", pos);
printf("目标:%s \n", pwd[pos].website);
printf("用户名:%s \n", pwd[pos].userName);
printf("密码:%s \n", pwd[pos].passWord);
printf("备注:%s \n", pwd[pos].note);
} printf("\n");
system("pause");
system("cls");
} // 保存密码(文本方式)
void SaveInfoA(PASSWORD pwd[], int nCount)
{
/*
读写文件的固定套路
1. 打开文件
2. 读写文件
3. 关闭文件
*/ // 打开文件
FILE *pFile;
errno_t err = fopen_s(&pFile, "data.txt", "w");
if (err != )
{
return;
} // 读写文件
fprintf(pFile, "==共计:%3d 条记录==================\n", nCount);
for (int i = ; i < nCount; i++)
{
fprintf(pFile, "目标: %s \n", pwd[i].website);
fprintf(pFile, "用户名: %s \n", pwd[i].userName);
fprintf(pFile, "密码: %s \n", pwd[i].passWord);
fprintf(pFile, "备注: %s \n", pwd[i].note);
} // 关闭文件
fclose(pFile);
printf("保存文本密码成功,使用后请尽快删除!!\n");
system("pause");
system("cls");
} //保存密码(二进制的方式)
void SaveInfoB(PASSWORD pwd[], int nCount)
{
// 打开文件
FILE *pFile;
errno_t err = fopen_s(&pFile, "data.i", "wb");
if (err != )
{
return;
} // 读写文件
fwrite(&nCount, sizeof(nCount), , pFile); // 当前密码个数
fwrite(&g_nNum, sizeof(g_nNum), , pFile); // 当前密码本容量(个数) //先加密(使用中间文件),在存储
int byteSize = sizeof(PASSWORD) * g_nNum;
char *buf = (char *)malloc(byteSize);
memcpy_s(buf, byteSize, pwd, byteSize); for (int i = ; i < byteSize; i++)
{
buf[i] ^= (i + nCount + g_nNum);
}
size_t rlen = fwrite(buf, sizeof(PASSWORD), g_nNum, pFile); // 密码数组
if (rlen != g_nNum)
{
printf("写入密码文件错误\n");
}
else
{
printf("成功!!\n");
} // 关闭文件
fclose(pFile);
free(buf);
} //从本地文件中读取密码,用于初始化密码本
void readInfo(PPASSWORD *ppPwd, int * pnCount)
{
// 打开文件
FILE *pFile;
errno_t err = fopen_s(&pFile, "data.i", "rb");
if (err != )
{
*ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD) * NUM);
g_nNum = NUM;
return;
} // 读写文件
// 先读取,再解密
fread(pnCount, sizeof(int), , pFile); // 当前密码个数
fread(&g_nNum, sizeof(g_nNum), , pFile); //当前密码本容量(个数)
*ppPwd = (PPASSWORD)malloc(sizeof(PASSWORD) * g_nNum);
memset(*ppPwd, , sizeof(PASSWORD)*g_nNum);
size_t rlen = fread(*ppPwd, sizeof(PASSWORD), g_nNum, pFile); // 密码数组 if (rlen != g_nNum)
{
printf("读取密码文件错误 \n");
fclose(pFile);
return;
} // typedef unsigned int size_t; int byteSize = sizeof(PASSWORD)*g_nNum;
char *buf = (char *)*ppPwd;
for (int i = ; i < byteSize; i++)
{
buf[i] ^= (i + *pnCount + g_nNum);
} // 关闭文件
fclose(pFile);
}
运行结果如下:

密码本(无bug版)的更多相关文章
- 【资源】C++学习资料 - 逆天整理 - 精华无密版【最新】
再失效就太无语了,链接都是多份的~~—————————————————基础——————————————C++环境搭建(全套)http://pan.baidu.com/s/1o6y0smY链接:http ...
- 漫谈程序猿系列:无BUG不生活
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- 【web 安全测试Tools】BurpSuite 1.7.32及注册机【无后门版】
BurpSuite 1.7.32 原版+注册机 下载 链接:https://pan.baidu.com/s/1LFpXn2ulTLlcYZHG5jEjyw 密码:mie3 注意无后门版文件完整性: b ...
- 佛祖保佑 永无bug
/* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : | ...
- 佛祖保佑,永无bug
/* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : | ...
- 佛祖保佑 永无BUG 永不修改
// // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`---'\___ // .' \\| ...
- 职业卖家淘宝美工教程,掌握技能无师自通 学到的不只是PS(共81节)附素材【无水印版】
职业卖家淘宝美工教程,掌握技能无师自通 学到的不只是PS(共81节)附素材[无水印版]设计传说出品的专业课程是我们资深培训讲师精心录制的,只有视频教程和常用必备的插件,其他绝不掺和,如果你是职业卖家, ...
- 佛主保佑,永无bug
/* _ooOoo_ o8888888o 88" . "88 ...
- 佛祖保佑 永无BUG(网转 by atkfc)
// _ooOoo_ // o8888888o // 88" . ...
随机推荐
- j2ee—框架(1):Servlet+JSP实现基本的登录功能(v1.0)
主要分为四个部分:LoginController.web.xml.login.jsp和login_success.jsp(login_fail.jsp). 第一部分 LoginController p ...
- Cstring, TCHAR*, char*的转换
最近老用到Cstring, TCHAR*, char*的转换. 找到一篇写得蛮详细的. 引用过来, 方便自己以后查阅. char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底 ...
- Winform程序部署方式总结一——ClickOnce发布
针对Winform程序,介绍两种常用打包方式:ClickOnce和Windows Installer 应用程序如下: 一.ClickOnce发布 1.找到需要发布的项目文件,右击,从弹出的快捷菜单中找 ...
- FZU 1492 地震预测(链表)
实际上把数组排序一遍加入链表中,再记录好数组原来的数在链表中的位置.我们只需要维护链表的删除操作就可以了. # include <cstdio> # include <cstring ...
- BZOJ 1816 扑克牌(二分)
由于答案具有单调性,考虑二分答案并验证. 如果能凑齐x堆,因为每个joke在一个牌堆里最多只能用一次,则至多只能用min(x,m)个joke. 对于每个牌,如果这个牌的总数小于x,用joke补齐剩下的 ...
- axios携带cookie配置详解(axios+koa) 原
话不多说,一个字,干! 前端配置如下: axios.defaults.withCredentials = true; //配置为tru openid: 'oJ0mVw4QrfS603gFa_uAFDA ...
- 20165218 学习基础和C语言基础调查
个人技能及阅读心得 个人技能之绘画 绘画是我从很小便开始接触的,从最初的简笔画到国画.素描.水粉,大约也学了七八年.但是到了高中之后,就逐渐放下了. 记得当初学素描时,老师的一句话让我记忆犹新,她说, ...
- [BZOJ1131/POI2008]Sta树的深度
Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...
- purfer序列题表
purfer序列是对于带编号(互不相同)的无根树进行编码得到的,对于同样的n个顶点,其有n-2项,有n^(n-2)种,而且每种都合法(如果只要求他是一棵树的话)(可以通过证明翻译过程维持了各部分的树的 ...
- django error: DisallowedHost: Invalid HTTP_HOST header: ''. You may need to add u'' to ALLOWED_HOST
测试环境: [root@nanx-lli ~]# lsb_release -aLSB Version: :core-4.1-amd64:core-4.1-noarchDistributor ID: C ...