寒假的比较无聊的小程序
2017-02-21 16:57
309 查看
大概就是输入路径打开一个加密后的文本文件,然后从给出的选项中选择或自定义一个口令,然后不断输入这个口令,就会显示解密后文本文件中的文字。另有一个闹着玩的防复制功能。。当然,还有配套的加密文本文件的程序。。是把我的期末作业稍作修改而成的。。就是这样。
首先是输入口令显示文字的程序。
main.c
function.c
-----------------------------------------------------------------------------------------------------------------------------
以下是加密的程序
首先是输入口令显示文字的程序。
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"); }
相关文章推荐
- 比较数组下标操作与指针操作的速度(将程序转换成汇编程序)
- 现流行数据库程序开发工具的比较分析
- JAVA 主要用来开发什么样类型的程序比较多?
- 看了网上的大多防SQL攻击程序,自己编写了一个函数,比较完美。大家一起测测~
- 比较简洁的Singleton Proces(唯一进程)程序
- JDK工具程序中比较重要的五个程序
- .Net应用程序发布问题的最新解决方案,感觉比较爽(可桌面、程序中加自己的ICO及卸载等(转贴)
- 无聊之极的无聊之“作”,C#加密程序
- 花语 比较无聊
- 一个比较有趣的自动生成迷宫程序.
- 引用:在衡量web用程序的性能时,哪些性能指标是比较重要的?
- 比较方便的ASP分页程序
- 使用 WebSphere Studio Application Developer 开发 Java 程序: 与 VisualAge for Java 进行比较
- 现流行数据库程序开发工具的比较分析
- [无聊日记]今天把过去学ASP.net的程序日志贴了上来
- 最近想看一看ALV的东东,想当年俺写的第一支像样的程序就是Step-Loop+ALV,呵呵,比较复杂的呀.
- 现流行数据库程序开发工具的比较分析
- .Net应用程序发布问题的最新解决方案,感觉比较爽(可桌面、程序中加自己的ICO及卸载等)
- 一个比较简单的,只做了正数,一万位以内的,阿拉伯数字转换成大写数字的程序
- 编写asp.net程序,当编译调试比较频繁的时候,很容易经常地出现访问被拒绝