C语言实现密码本小项目

一、引言

学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;
 }
 }

四、总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现密码本

    本文实例为大家分享了C语言实现密码本的具体代码,供大家参考,具体内容如下 功能简述: 1.账号登陆(密码验证,三次锁定账号) 2.功能选择:1.查看所有密码 2.新增密码 3.删除密码 4.修改密码 5.查询密码 6.解除锁定 7.退出登陆 3.保存密码,文件加密 4.流程图: 数据定义部分 #pragma once //变量声明 #define NUM 100 //初始密码本容量 extern int g_nNum; //当前密码本容量 extern int g_lock_flag; //锁定

  • C语言实现密码本小项目

    一.引言 学C语言有一段时间了,趁着正好做了密码本的小项目,把它分享出来. 二.思路与原理 密码本,见名知意,就是存放账号密码,起到备忘录作用的本子,将需要备忘的数据通过加密存放在文本文件中,打开的文本文件为加密文本,需要通过软件查看已经存放的数据,提高安全性.(软件设计了启动密码,三次过后自动退出) 项目目标: 保存账号密码,退出后打开软件数据不丢失 进行简单加密 能按条件查找账号密码 能修改账号密码数据 能按条件进行删除数据 知识涉及到数组.文件操作的使用以及简单异或加密. 软件的部分截图如

  • C语言学生信息管理系统小项目

    本文为大家分享了C语言学生信息管理系统小项目,供大家参考,具体内容如下 /* 运行环境:我是在linux里面用gcc编译的,在windows里应该也能运行,用的一些文件库函数都是c标准库,没有用linux的系统调用(纠正一下:system("clear")这个系统调用是linux的,windows里面用system("cls") ) (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功

  • C语言实现猜数字小项目

    学习完c语言循环.选择内容,我们对c语言有个初步的认识了,让我们来实现一个小项目吧!!! 1.猜数字小项目分析: 我们利用c语言制造出随机数来猜,在只知道范围的前提下我们无非有以下三种可能,猜大了.猜小了.猜对了.如果猜错了我们让玩家继续猜直到猜对为止,若猜对了给出选择是否继续玩哈!!! 2.项目实现 我们定义两个函数 菜单函数 void menu() {     printf("********************\n");     printf("***** 1.pl

  • C语言实现扫雷游戏小项目

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 一.基本实现功能 1.建立一个游戏菜单 2.创建游戏盘,一个埋雷,一个显示. 3.打印游戏盘. 4.翻开坐标如若没踩到雷显示周围一圈8个有几个雷. 5.判断胜利 翻开的格子数等于没埋雷的个数. 二.源代码展示 1.头文件  minesweep.h #pragma once #include <stdio.h> #include <Windows.h> #include <string.h> #i

  • C语言小项目计时器的实现思路(倒计时+报警提示)

    目录 实现思路 1.极简版本 运行效果 2.普通版本 运行效果 3.高级版本 运行效果 大家对计时器应该不陌生,我们在制定一个计划时,经常喜欢设置一个倒计时来规定完成时限,等到计时结束,它还会报警提示,今天,我就用C语言编写一个简易的倒计时计时器. 实现思路 简单介绍一下我的实现思路: 本文包括三个版本,分别是极简版.普通版.高级版: 极简版:简单的单次倒计时,只能设置秒数,计时通过Sleep()函数实现(粗略倒计时),先输入秒数cnt,然后每过1秒(Sleep(1000),cnt减1,直到cn

  • C语言实现密码程序

    本文为大家分享了C语言实现密码程序的具体代码,供大家参考,具体内容如下 题目要求 编写代码实现,模拟用户登录情景,并且只能登录三次.(只允许输入三次密码,如果密码正确则提示 登录成,如果三次均输入错误,则退出程序. 逻辑分析 3次循环,如果输入正确的话,则输入正确登录成功,否则输入错误请重新输入,循环三次.如果超过三次跳出循环,则登录失败,程序退出. 核心代码 for(i=0;i<3;i++) { scanf("%s",hsl); if(strcmp(hsl,"1234

  • Python语言编写智力问答小游戏功能

    本篇博文将使用Python代码语言简单编写一个轻松益智的小游戏,效果如下所示: 1.设计思路 本项目使用SQLite建立问答题库,每道题包括4个选项答案(3个正确答案,1个错误答案).每道题都有一定分值,根据用户的答题效率,自动计算出最后的答题成绩. 2.建立题库 使用SQLite数据库建立题库,本质上就是SQL语句,创建exam表,实现代码如下所示: #导入SQLite驱动 import sqlite3 # 连接到SQLite数据库,数据库文件是test.db # 如果文件不存在,会自动在当前

  • Android带清除按钮、密码可见小眼睛的输入框

    前言 相信不少小伙伴在开发登录功能时候,或多或少都会用到输入框清除按钮.密码可见与隐藏小眼睛按钮,我之前也是但写这个功能,但是在找回密码.忘记密码里面还要重新写一次很是麻烦,现在我把它只做了一个自定义控件,可以配置清除按钮.密码可见小眼睛是否显示以及图标,有渐隐渐显和横向移动动画,不知道怎么上传可以直接观看的视频,附上三张效果图,可以点击链接观看视频是否是你想要的效果.   一.自定义控件ClearEditText 我的这个自带清除.小眼睛的控件,是一个自定义控件,控件名称ClearEditTe

  • Linux下C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的 心得: 1.自己对linux中如何使用vi更加熟悉 如::wq yy pp dd u 等等 2.对c语言的指针,结构体,链表等更加的牢固 3.借此小项目也运用到多线程作为进入linux的深入学习打下坚实的基础 代码展示 #include<curses.h> #include<stdlib.h> #define UP 1 //1与-1的目的

  • C语言版猜数字小游戏

    本文实例为大家分享了C语言版猜数字小游戏的具体代码,供大家参考,具体内容如下 清楚实现目标 做任何一个小项目之前,我们首先都需要明确自己想要实现的目标. 所以猜数字游戏的实现目标是啥? 电脑随机给出一个目标数字,玩家进行猜测 电脑会根据玩家猜测的数字,提示猜大了还是小了 直到猜对为止,一轮游戏结束. 游戏结束会询问是否继续.1代表继续,0代表不继续. 游戏模式有3种(简单,普通,困难),对应内容分别为猜25次,15次,5次 游戏会记录你的战绩,在菜单中按2表示查询战绩. 明确逻辑结构 清楚的知道

随机推荐