您的位置:首页 > 移动开发 > 微信开发

寒假的比较无聊的小程序

2017-02-21 16:57 309 查看
大概就是输入路径打开一个加密后的文本文件,然后从给出的选项中选择或自定义一个口令,然后不断输入这个口令,就会显示解密后文本文件中的文字。另有一个闹着玩的防复制功能。。当然,还有配套的加密文本文件的程序。。是把我的期末作业稍作修改而成的。。就是这样。

首先是输入口令显示文字的程序。

main.c

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define N1 6
#define N2 5
#define N_T 1000
#define N_K 3
#define LIM 8
int judge(int,char *);
void output(int,int,int *,char (* )[10],char *);
void show_menu();
int make_choice();
int custom_password(int *,char (* )[10]);
void show_instructions_custom();
void show_password(int,char(*)[10]);
void show_instructions_output();
void decrypt(int,char *,int *,char *);
int judge_differtime(long ,long);
int main()
{
int j,n3,count_t=0;
char password_1[N1][10]= {"lu","lu","sheng","ri","kuai","le"};
int count_1[N1]= {2,2,5,2,4,2};
char password_2[N2][10]= {"happy","birthday","to","lu","lu"};
int count_2[N2]= {5,8,2,2,2};
char password_3[20][10];
int count_3[20];
int en_text[N_T];
char text[N_T],key[N_K];
char j_re;
char path[80];
FILE *fp;
printf("输入要打开的文本文件的路径(例:E:/LULU/lulu.txt或E:\\\\LULU\\\\lulu.txt):\n");
scanf("%s",path);
fp=fopen(path,"r");//打开文件
while(fp==NULL)//判断是否打开成功
{
printf("打开文件失败,检查一下路径有没有错,然后再输一次:\n");
scanf("%s",path);
fp=fopen(path,"r");
}
printf("成功打开文件!\n");
while(fscanf(fp,"%d",&en_text[count_t])!=EOF)//将内容读取到数组中
++count_t;
fclose(fp);//关闭文件
printf("输入加密关键字(三个字符组成的,猜猜看~):");
scanf("%s",key);
while(key[N_K]!='\0')
{
printf("都说了是三个字符组成的:");
scanf("%s",key);
}
decrypt(count_t,text,en_text,key);//解密文件,存到数组
show_menu();
j=make_choice();//判断选择的口令
if(j==1)
output(N1,count_t,count_1,password_1,text);//输出
else if(j==2)
output(N2,count_t,count_2,password_2,text);//输出
else
{
show_instructions_custom();
printf("那么,输入口令吧:");
n3=custom_password(count_3,password_3);
show_password(n3,password_3);
j_re=getch();
while(j_re=='\r')
{
printf("想仔细了再输入哈~~:");
n3=custom_password(count_3,password_3);
show_password(n3,password_3);
j_re=getch();
}
if(n3<3)
{
printf("输入的口令有点短,还要改吗?输入'Y'或‘N’\n");
j_re=getch();
while(j_re!='Y'&&j_re!='N')
{
printf("输入'Y'或'N'好吧~:");
j_re=getch();
}
if(j_re=='Y')
{
printf("那么,输入口令吧:\n");
n3=custom_password(count_3,password_3);
show_password(n3,password_3);
}
else
printf("那你可别后悔哈~\n");
}
output(n3,count_t,count_3,password_3,text);
}
printf("\n以上就是全部内容,谢谢使用~\n按任意键结束程序");
getch();
return 0;
}

function.c
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define N1 6
#define N2 5
#define N_T 1000
#define N_K 3
#define LIM 8
int judge(int,char *);
void output(int,int,int *,char (* )[10],char *);
void show_menu();
int make_choice();
int custom_password(int *,char (* )[10]);
void show_instructions_custom();
void show_password(int,char(*)[10]);
void show_instructions_output();
void decrypt(int,char *,int *,char *);
void judge_differtime(long,long);
void show_menu()
{
printf("先选一个口令吧~\n");
printf("1.lulushengrikuaile\n");
printf("2.happybirthdaytolulu\n");
printf("3.自定义一个口令\n");
}
int make_choice()
{
int j=0;
printf("然后输入1、2或3:");
scanf("%d",&j);
while(j!=1&&j!=2&&j!=3)//确保输入的是1或2或3
{
printf("都说了要输入1、2或3:");
scanf("%d",&j);
}
return j;
}
void output(int n,int count_t,int *count,char (*password)[10],char *text)
{
show_instructions_output();
int i,j,i_t=0,count_n=0;
long int time1,time2;
while(i_t<count_t)
{
time1=time(NULL);
for(i=0; i<n; ++i)
{
j=judge(count[i],password[i]);
if(j==1)
{
if(text[i_t]<0)//判断是中文字符还是英文字符
{
printf("%c%c",text[i_t],text[i_t+1]);
i_t+=2;
}
else
{
printf("%c",text[i_t]);
++i_t;
}
if(i_t>count_t)
break;
++count_n;
}
else if(j==0)//本单词输入不匹配
i--;//重新开始本单词输入
else//用户按下回车
i=-1;//从头开始输入
if(count_n==4)
{
time2=time(NULL);
judge_differtime(time1,time2);
time1=time2;
count_n=0;
}
}
}
}
int judge(int n,char *s)
{
int i,sum=0;
char j;
for(i=0; i<n; ++i)
{
j=getch();
if(j=='\b')
return 0;
if(j=='\r')
return -1;
sum+=(j==s[i])?1:0;
}
if(sum==n)
return 1;
else
return 0;
}
int custom_password(int *count,char (*password)[10])
{
int i=0,n=0;
while(1)
{
i=0;
count
=0;
while(1)
{
password
[i]=getch();
if(password
[i]==' ')//按空格键结束当前字符串输入
{
printf("%c",password
[i]);
password
[i]='\0';
if(i==0)//用来忽略掉直接输入空格的情况
--n;
break;
}
else if(password
[i]=='\b')//显示为删除效果
{
printf("\b \b");
--i;
password
[i]='\0';
}
else if(password
[i]=='\r')//按回车键结束输入
break;
else
{
printf("%c",password
[i]);
++i;
}
}
if(i!=0)
count
=i;//记录字符串的长度
if(password
[i]=='\r')//判断是否结束输入
{
password
[i]='\0';
if(i==0)//用于过滤最后输入的空格
--n;
break;
}
++n;
}
return n+1;
}
void show_instructions_custom()
{
printf("自定义口令的格式为拼音或英文单词组成的一串字符\n");
printf("每个拼音或单词的长度小于10,拼音或单词的总个数小于20\n");
printf("每输入完一个拼音或单词后按空格键结束,全部输入完后按回车键结束\n");
printf("按下空格后,该拼音或单词即不可更改,若输入错误,可以按下回车后选择重新定义口令\n");
}
void show_password(int n,char(*password)[10])
{
int i;
printf("\n此次自定义的口令为:");
for(i=0; i<n; ++i)
printf("%s ",password[i]);
printf("\n如果要重新定义口令,请按回车\n如果对设置的口令满意,请按除回车外的任意键\n");
}
void show_instructions_output()
{
printf("请直接输入口令,不需要按空格,将不显示输入内容\n");
printf("若当前拼音或单词输入错误,按退格键,然后重新输入当前拼音或单词\n");
printf("若不知道输入到哪了,按回车键,然后从头开始输入口令\n");
printf("虽然你可能知道点击左上角显示菜单,在编辑一栏中有复制粘贴的功能,但是不要用。。当然,尽管试试~\n");
printf("出现提示后等待提示消失,然后按回车键继续输入~\n");
}
void decrypt(int n,char *text,int *en_text,char *key)
{
int i;
key[0]=(key[0]<<N_K)|(key[0]>>(sizeof(key[0])*8-N_K));
key[2]=(key[2]>>N_K)|(key[2]<<(sizeof(key[2])*8-N_K));
for(i=0; i<n; ++i)
{
switch((i+1)%8)
{
case 1:
case 4:
case 7:
text[i]=en_text[i]^key[0];
break;
case 2:
case 5:
case 0:
text[i]=en_text[i]^key[1];
break;
default:
text[i]=en_text[i]^key[2];
break;
}
}
}
void judge_differtime(long time1,long time2)
{
int i;
if((time2-time1)<=1)
{
printf("*不要急嘛~慢慢输入 ");
for(i=19; i>0; --i)
{
printf("%02d",i);
Sleep(1000);
printf("\b\b");
}
printf("  ");
for(i=0; i<21; ++i)
printf("\b \b");
while(getch()!='\r');
}
}


-----------------------------------------------------------------------------------------------------------------------------
以下是加密的程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N_P 5000
#define N_K 3
void encrypt(int, char *, char *);
void decrypt(int, char *,int *,char *);
void judge_fail(FILE *);
int main()
{
char text[N_P],key[N_K+1],path[80];
int en_text[N_P];
int i,j,count;
FILE *fp1;
FILE *fp2;
while(1)
{
fflush(stdin);
printf("请输入 1.加密;2.解密;3.退出 :");
scanf("%d",&j);
if(j==3)
exit(0);
if(j!=1&&j!=2)
continue;
printf("请输入加密关键字(三个字符):");
scanf("%s",key);
while(key[N_K]!='
b71a
\0')
{
printf("请输入三个字符作为加密关键字:");
scanf("%s",key);
}
key[0]=(key[0]<<N_K)|(key[0]>>(sizeof(key[0])*8-N_K));//循环移位
key[2]=(key[2]>>N_K)|(key[2]<<(sizeof(key[2])*8-N_K));//循环移位
if(j==1)
{
printf("请输入原文件路径:");
scanf("%s",path);
fp1=fopen(path,"r");
judge_fail(fp1);//判断是否打开成功
printf("请输入储存加密信息的文件路径:");
scanf("%s",path);
fp2=fopen(path,"w");
judge_fail(fp2);//判断是否打开成功
count=0;
while(fscanf(fp1,"%c",&text[count])!=EOF)
++count;
encrypt(count,text,key);
for(i=0;i<count;++i)
{
fprintf(fp2,"%d ",text[i]);
}
printf("加密成功!\n");
fclose(fp1);
fclose(fp2);
}
else
{
printf("请输入原文件路径:");
scanf("%s",path);
fp1=fopen(path,"r");
judge_fail(fp1);//判断是否打开成功
printf("请输入储存解密信息的文件路径:");
scanf("%s",path);
fp2=fopen(path,"w");
judge_fail(fp2);//判断是否打开成功
count=0;
while(fscanf(fp1,"%d",&en_text[count])!=EOF)
++count;
decrypt(count,text,en_text,key);
for(i=0; i<count; ++i)
fprintf(fp2,"%c",text[i]);
printf("解密成功!\n");
fclose(fp1);
fclose(fp2);
}
}
return 0;
}
void encrypt(int n,char *text,char *key)
{
int i;
for(i=0; i<n; ++i)
{
switch((i+1)%8)
{
case 1:
case 4:
case 7:
text[i]^=key[0];
break;
case 2:
case 5:
case 0:
text[i]^=key[1];
break;
default:
text[i]^=key[2];
break;
}
}
}
void decrypt(int n,char *text,int *en_text,char *key)//通过按位异或加密
{
int i;
for(i=0; i<n; ++i)
{
switch((i+1)%8)
{
case 1:
case 4:
case 7:
text[i]=en_text[i]^key[0];
break;
case 2:
case 5:
case 0:
text[i]=en_text[i]^key[1];
break;
default:
text[i]=en_text[i]^key[2];
break;
}
}
}
void judge_fail(FILE *fp)
{
char path[80];
while(fp==NULL)//判断是否打开成功
{
printf("打开文件失败,检查一下路径有没有错,然后再输一次:\n");
scanf("%s",path);
fp=fopen(path,"r");
}
printf("成功打开文件!\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐