一、引言

学C语言有一段时间了,趁着正好做了密码本的小项目,把它分享出来。

二、思路与原理

密码本,见名知意,就是存放账号密码,起到备忘录作用的本子,将需要备忘的数据通过加密存放在文本文件中,打开的文本文件为加密文本,需要通过软件查看已经存放的数据,提高安全性。(软件设计了启动密码,三次过后自动退出)

项目目标:

  • 保存账号密码,退出后打开软件数据不丢失
  • 进行简单加密
  • 能按条件查找账号密码
  • 能修改账号密码数据
  • 能按条件进行删除数据

知识涉及到数组、文件操作的使用以及简单异或加密。

软件的部分截图如下:  
                          

            主菜单

                         

增加数据

                         

                                                                              删除数据

                       

  查询数据

                      

全部数据

三、实现

1.头文件及数据定义

在密码本的小项目中我设立四个了存放数据的数组,所存放的账号密码的站点,存放的账号,存放的密码以及备注。定义了一个全局变量,用来计数当前密码本使用的条数。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//定义四个数组,用来存放站点、账号、密码、备注的值
char webSite[100][20];
char userName[100][20];
char passWord[100][20];
char reMark[100][20];
//定义一个全局变量
int g_count = 0;

2.程序的整体框架

int main(void)
{InitInfo();int nChoice = 1;StartPassWord();while (nChoice){printf("*********************************欢迎使用密码本*********************************\n");printf("                             请输入以下选项进行操作:                           \n");printf("                                 1、增加数据                                    \n");printf("                                 2、删除数据                                    \n");printf("                                 3、修改数据                                    \n");printf("                                 4、查询数据                                    \n");printf("                                 5、全部数据                                    \n");printf("                                 6、结束程序                                    \n");printf("********************************************************************************\n");scanf_s("%d", &nChoice);switch (nChoice){case 1:{AddInfo();//增加数据   }break;case 2:{DelInfo(); //删除数据}break;case 3:{EditInfo();//修改数据}break;case 4:{FindInfo();//查询数据}break;case 5:{ReadAllInfo();//查看全部}break;case 6:{nChoice = 0;//退出程序}break;}}printf("欢迎下次使用!\n");system("pause");return 0;
}

3.函数的声明

//启动时输入密码
void StartPassWord();
//增加数据
void AddInfo();
//删除数据
void DelInfo();
//修改数据
void EditInfo();
//查询数据
void FindInfo();
//读取全部数据
void ReadAllInfo();
//保存数据
void SaveInfo();
//初始化数据
void InitInfo();

4.各个函数的实现

//增加数据
void AddInfo()
{printf("输入需要存储的 站点:");scanf_s("%s", webSite[g_count], 20);printf("输入需要存储的 账号:");scanf_s("%s", userName[g_count], 20);printf("输入需要存储的 密码:");scanf_s("%s", passWord[g_count], 20);printf("输入需要存储的 备注:");scanf_s("%s", reMark[g_count], 20);g_count++;SaveInfo();InitInfo();system("pause");system("cls");
}//查看全部
void ReadAllInfo()
{FILE *pfile;if (fopen_s(&pfile, "data.i", "r") != 0){printf("file open fail");exit(1);}fscanf_s(pfile, "当前个数%d\n", &g_count);printf("当前有%d条数据\n", g_count);for (int i = 0; i < g_count; i++){printf("第%d条数据:\n", i + 1);printf("站点:%s,账号:%s,密码:%s,备注:%s",webSite[i], userName[i], passWord[i], reMark[i]);printf("\n");}fclose(pfile);system("pause");system("cls");
}//保存数据
void SaveInfo()
{for (int j = 0; j < g_count; j++){for (int m = 0; m < 20; m++){webSite[j][m] ^= 5;userName[j][m] ^= 5;passWord[j][m] ^= 5;reMark[j][m] ^= 5;}}FILE *pfile;if (fopen_s(&pfile, "data.i", "w") != 0){printf("file open fail");exit(1);}fseek(pfile, 0, SEEK_SET);fprintf(pfile, "当前个数%d\n", g_count);for (int i = 0; i < g_count; i++){fwrite(webSite[i], 20, 1, pfile);fwrite(userName[i], 20, 1, pfile);fwrite(passWord[i], 20, 1, pfile);fwrite(reMark[i], 20, 1, pfile);fprintf(pfile, "\n");}fclose(pfile);
}//删除数据
void DelInfo()
{char aTemp[20];int nFind = 0;int nIndex = 0;printf("请输入要删除的站点:\n");scanf_s("%s", aTemp, 20);for (; nIndex < g_count; nIndex++){if (strcmp(aTemp, webSite[nIndex]) == 0){nFind = 1;break;}}if (nFind == 1){for (int i = nIndex; i < g_count; i++){strcpy_s(webSite[i], 20, webSite[i + 1]);strcpy_s(userName[i], 20, userName[i + 1]);strcpy_s(passWord[i], 20, passWord[i + 1]);strcpy_s(reMark[i], 20, reMark[i + 1]);}g_count--;SaveInfo();InitInfo();printf("删除成功\n");}else{printf("查找失败!\n");}system("pause");system("cls");
}//初始化数据
void InitInfo()
{FILE *pfile;if (fopen_s(&pfile, "data.i", "r") != 0){printf("请先建立data.i文件!");system("pause");exit(1);}fscanf_s(pfile, "当前个数%d\n", &g_count);for (int i = 0; i < g_count; i++){fread(webSite[i], 20, 1, pfile);fread(userName[i], 20, 1, pfile);fread(passWord[i], 20, 1, pfile);fread(reMark[i], 20, 1, pfile);fscanf_s(pfile, "\n");}for (int j = 0; j < g_count; j++){for (int m = 0; m < 20; m++){webSite[j][m] ^= 5;userName[j][m] ^= 5;passWord[j][m] ^= 5;reMark[j][m] ^= 5;}}fclose(pfile);
}//查询数据
void FindInfo()
{char aTemp[20];int nFind = 0;printf("请输入要查询的站点:\n");scanf_s("%s", aTemp, 20);for (int nIndex = 0; nIndex < g_count; nIndex++){if (strcmp(aTemp, webSite[nIndex]) == 0){nFind = 1;}if (nFind == 1){printf("站点:%s,账号:%s,密码:%s,备注:%s\n",webSite[nIndex], userName[nIndex], passWord[nIndex], reMark[nIndex]);break;}}if (nFind == 0){printf("查找失败!\n");}system("pause");system("cls");
}//修改数据
void EditInfo()
{char aTemp[20];int nFind = 0;printf("请输入要修改的站点:\n");scanf_s("%s", aTemp, 20);for (int nIndex = 0; nIndex < g_count; nIndex++){if (strcmp(aTemp, webSite[nIndex]) == 0){nFind = 1;}if (nFind == 1){printf("输入需要修改的 账号:");scanf_s("%s", userName[nIndex], 20);printf("输入需要修改的 密码:");scanf_s("%s", passWord[nIndex], 20);printf("输入需要修改的 备注:");scanf_s("%s", reMark[nIndex], 20);printf("站点:%s,账号:%s,密码:%s,备注:%s\n",webSite[nIndex], userName[nIndex], passWord[nIndex], reMark[nIndex]);SaveInfo();break;}}if (nFind == 0){printf("查找失败!\n");}system("pause");system("cls");
}//启动时输入密码
void StartPassWord()
{char spw[10] = "abcd";   //程序的启动密码char write[10] = "";int nSuccess = 0;for (int i = 1; i <= 3; i++){printf("请输入启动密码:\n");scanf_s("%s", write, 10);if (strcmp(write, spw) == 0){nSuccess = 1;break;}else{printf("你的输入有误!还有%d次机会\n", 3 - i);system("pause");system("cls");}}if (nSuccess == 1){printf("输入正确!按任意键开始使用程序\n");}else{printf("输入全部错误!按任意键结束程序\n");system("pause");exit(1);}system("pause");system("cls");
}

5.关于加密

异或加密:异或是一种运算方式,在C语言中是^符号,通常可以用于加密。

例如项目中的实现

for (int j = 0; j < g_count; j++){for (int m = 0; m < 20; m++){webSite[j][m] ^= 5;userName[j][m] ^= 5;passWord[j][m] ^= 5;reMark[j][m] ^= 5;}}

四、总结

程序中还有很有缺陷,第一次写博客,希望大家多多包涵!

C语言入门——适合练手的密码本项目相关推荐

  1. 有哪些适合练手的爬虫小项目?

    点击上方蓝色字体,星标公众号 我们正在发起一场公益活动: 无私帮助大家解决难题,真正解决的那种! 问答起飞 如果你平时遇到任何困扰你已久的问题,可以加群,告诉我们,统一记录到<QA>表中. ...

  2. 用Python打造属于自己的“今日头条” | 一个非常适合练手的全栈项目

    项目简介 通过抓取微信文章和今日头条新闻,仿照今日头条,打造一个自己的今日头条 基本思路 新闻下载 -> 新闻存储 -> 新闻展示 抓取源: 今日头条app新闻 https://lf.sn ...

  3. 推荐一些适合新手练手的C/C++项目

    最好的编程语言是什么?一千个程序员或许会有一千零一种答案: Python在人工智能时代的风头正盛.Java依旧是市场上的香饽饽.当然还有PHP:JavaScript.C#.Ruby以及Objectiv ...

  4. Android股票app模拟同花顺,适合练手的Android项目

    本项目是一款Android股票app软件,模拟同花顺,高仿微信九宫格图片浏览和Activity滑动返回,使用Volley网络请求和MVP框架 ,PullToRefreshRecyclerView.自定 ...

  5. 适合初学者练手的vue小项目(附github源码)

    vue慢慢的成为了前端最受欢迎的框架之一,在很多项目之中开发都能用得到,如今也已经发展到3.0了,可能是因为这个框架可以提高工作效率,因此受到大家的追捧,在之前的文章里面也说过,2019年,大前端学习 ...

  6. java 适合练手的java项目

    Java作为一门古老的语言,已有20年左右的历史,这在发展日新月异的技术圈可以说是一个神话. 虽然不少人曾抱怨Java语言就像老太太的裹脚布,又臭又长,有时写了500行都不能表达程序员的意图. 但从市 ...

  7. 分析绕过一款适合练手的云WAF

    X-WAF是一款使用中.小企业的云WAF系统,让中.小企业也可以非常方便地拥有自己的免费云WAF. 本文从代码出发,一步步理解WAF的工作原理,多姿势进行WAF Bypass. 0x01 环境搭建 官 ...

  8. 有哪些适合新手练手的C/C++项目?

    1.(免费项目) C/C++ - C语言制作简单计算器 2.(会员项目) C/C++ - C语言实现通讯录 项目使用 C 语言完成一个简单的通讯录.会涉及到结构体.数组.链表等重要概念.此项目为实验楼 ...

  9. part1:推荐一些适合练手、课程设计、毕业设计的python小项目源码,无任何下载门槛

    人生苦短,我用python,随着python这些年的流行,很多人开始使用python来实现各种功能.下面推荐一些适合用来练手.大学生课程设计作业.大学生毕业设计的python小项目,尤其适合新手,源码 ...

  10. 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

    还愁没有练手的项目?我已经给你准备好了,需要评论区留下你的想法吧 1.引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 ...

最新文章

  1. Mac 安装Fiddler 抓包工具
  2. Fragment要点复习
  3. 二分图的最大匹配 匈牙利算法
  4. 2.非关系型数据库(Nosql)之mongodb:mongodb显示所有数据库,使用数据库,集合创建(显示和隐式创建),集合查询,初步数据的增删改查,分页
  5. 利用克鲁斯卡尔算法求最小生成树
  6. ROS2学习(一).Ubuntu 20.04安装ROS2 Galactic
  7. WF4.0 基础篇 (二十九) WorkflowInspectionServices
  8. arm b bl 地址无关码_32位和64位下的arm_pwn初探
  9. 使用 Redis 实现 Session 共享
  10. azure创建centos_使用Azure Power BI创建Azure数据仓库报告
  11. Android播放器
  12. hp服务器修改风扇转速,如何改变惠普笔记本风扇转速
  13. 【JavaWeb】Filter案例:登录验证、敏感词汇过滤
  14. 软件工程实践: 敏捷开发流程图(scrum)
  15. Qt应用开发视频教程
  16. Playmaker节点工具使用(三)—扩展playmaker
  17. 计算机上面的清除键是什么符号,电脑上删除键是哪一个
  18. hadoop原理示意图
  19. HiveSQL中级进阶常用技巧
  20. 求阶乘的和(C++)

热门文章

  1. 计算机打印错误,打印机错误正在打印处理方法,教您电脑打印机错误正在打印处理方法...
  2. 私人助手android,私人助手Pro专业版
  3. python爬虫豆瓣推理书籍及链接
  4. html实现百度换肤,百度换肤
  5. coreos 安装 mysql_在CoreOS下部署WordPress实例教程
  6. 【GlobalMapper精品教程】005:影像拼接与裁切(分幅)作业案例教程
  7. php vld 安装,PHP性能之语言性能优化:vld
  8. Win10屏幕自带的截图,同时保存多个截图
  9. 原生js获取html根元素,JS获取屏幕高度的简单实现代码
  10. bootstrap-toastr 消息通知插