寒假的比较无聊的小程序

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

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

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[n]=0;
        while(1)
        {
            password[n][i]=getch();
            if(password[n][i]==' ')//按空格键结束当前字符串输入
            {
                printf("%c",password[n][i]);
                password[n][i]='\0';
                if(i==0)//用来忽略掉直接输入空格的情况
                    --n;
                break;
            }
            else if(password[n][i]=='\b')//显示为删除效果
            {
                printf("\b \b");
                --i;
                password[n][i]='\0';
            }
            else if(password[n][i]=='\r')//按回车键结束输入
                break;
            else
            {
                printf("%c",password[n][i]);
                ++i;
            }
        }
        if(i!=0)
            count[n]=i;//记录字符串的长度
        if(password[n][i]=='\r')//判断是否结束输入
        {
            password[n][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]!='\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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值