BUAA大一下数据结构题解(加密文件)

本文详细介绍了如何使用特定密钥 'feather' 进行字母替换加密,包括去除重复字母、创建加密对应表并应用于文件encrypt.txt中的内容,最终生成output.txt。通过实例展示了加密过程和结果。
摘要由CSDN通过智能技术生成

【问题描述】有一种加密方法为:其使用一个字母串(可以含重复字母,字母个数不超过50)作为密钥。假定密钥单词串为feather,则先去掉密钥单词中的重复字母得到单词串feathr,然后再将字母表中的其它字母以反序追加到feathr的后面:

 f e a t h r z y x w v u s q p o n m l k j i g d c b 

加密字母的对应关系如下:

 a b c d e f g h i j k l m n o p q r s t u v w x y z
 f e a t h r z y x w v u s q p o n m l k j i g d c b

其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密文件。假定要加密的文件名为encrypt.txt及加密后的文件名为output.txt,并假定输入文件中字母全为小写字母,并且输入密钥也全为小写字母

【输入形式】从标准输入中输入密钥串,并从文件encrypt.txt中读入要加密的内容。
【输出形式】加密后结果输出到文件output.txt中。
【样例输入】
feather
和文件encrypt.txt中内容,例如被加密的文件encrypt.txt中内容为:
c language is wonderful.
【样例输出】加密后output.txt文件中内容为:
a ufqzjfzh xl gpqthmrju.
【样例说明】首先将给定的密钥单词去除重复字母,然后按照上面的加密对应表对encrypt.txt文件内容进行加密即可得到加密后的文件,其中只对英文字母进行加密对换,并且假设encrypt.txt中的英文字母全是小写字母。

【评分标准】该题要求对文件进行加密,共有5个测试点。提交程序名为encrypt.c

解题思路:这道题思路较为简单,首先将密匙读入,然后处理密匙,得到我们的密码本,然后一个一个的读入文本中的字符,然后将文本中的字符按照我们的密码本进行替换,然后将替换后的字符输出。(题目中标红的部分表示文本中全为小写字母,大大简化了我们的操作,也可以尝试没有这句话,程序会是什么样子)。

参考代码:

#include <stdio.h>
char ch[51],str[100000],ab[]="abcdefghijklmnopqrstuvwxyz";
int main()
{
    FILE *fp,*pp;
    fp=fopen("encrypt.txt","r");
    pp=fopen("output.txt","w");//打开需要的文件
    int i=0,j=0,k=0,lench=0,flag=0,n=0,lenstr=0;
    char hold,p;
    scanf("%s",ch);//读取密匙
    p=fgetc(fp);
    lench=strlen(ch);//获得密匙长度
    for(i=0;i<lench;i++)//从前向后遍历密匙
    {
        for(j=i+1;j<lench;j++)//寻找该字符后面是否有重复的
        {
            if(ch[i]==ch[j])//如果有
            {
                for(k=j;k<lench;k++)
                    ch[k]=ch[k+1];//将重复字符后面的字符都向前移一位
                lench--;//密匙删掉一个字符,长度减一
                j--;//此时ch【j】已经是新的字符,因为for循环里j++,这里的j要减一
            }
        }
    }//将密匙中的重复字符删去
    lench=strlen(ch);//更新处理后的密匙长度
    for(i=0,j=25;i<j;i++,j--)
    {
        hold=ab[j];
        ab[j]=ab[i];
        ab[i]=hold;
    }//将ab中的字符倒过来,其实这一步没必要,在下一个for循环中从后向前就行
    for(i=0,n=0;i<26;i++)
    {
        flag=0;
        for(j=0;j<lench;j++)
        {
            if(ab[i]==ch[j])
            {
                flag=1;
                break;
            }
        }//寻找ab中对应的字母是否已经在密匙中
        if(flag==0)
        {
            ch[lench+n]=ab[i];
            n++;
        }//如果没有,则将其加入密匙中
    }
    lench=strlen(ch);//更新密匙长度,这里的长度应该等于26
    for(i=0,j=25;i<j;i++,j--)
    {
        hold=ab[j];
        ab[j]=ab[i];
        ab[i]=hold;
    }//再将ab倒过来,所以上文中说没有必要
    while(p!=EOF)
    {
        for(j=0;j<26;j++)
        {
            if(p==ab[j])
            {
                p=ch[j];
                break;
            }
        }//将读取到的字符进行替换
        fputc(p,pp);//然后输出
        p=fgetc(fp);//再次读入下一个字符
    }
    fclose(fp);
    fclose(pp);//关闭文件
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值