天天看点

加密文件

!!记得不要抄!!

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

加密文件

加密字母的对应关系如下

加密文件

其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密文件。假定要加密的文件名为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中的英文字母全是小写字母。

方法一

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

void repeat(char *s);

char s[55];
int len_s;

int main()
{
    int len = 25; //len是26个字母,下标25
    scanf("%s", &s);
    repeat(s);
    for (int i = 0; i < 26; i++)
    {
        int flag = 0;
        for (int j = 0; j < len_s; j++)
        {
            if (s[j] == 'a' + i)
            {
                flag++;
                break;
            }
        }

        if (flag == 0)
        {
            s[len--] = 'a' + i; //补全26个字
        }

    } //经过调试s数组以正确

    FILE *fp, *pp;
    fp = fopen("encrypt.txt", "r");
    pp = fopen("output.txt", "w");

    char ch;
    ch = fgetc(fp);
    while (ch != EOF) //对应字母进行输出
    {
        if (!isalpha(ch))
        {
            fputc(ch, pp);
        }
        else
            fputc(s[ch - 'a'], pp);
        ch = fgetc(fp);

    }
    fclose(fp);
    fclose(pp);
}

void repeat(char *s) //去重
{
    int i, j, b, c;
    j = c = 0;

    for (i = 0; s[i]; i++)
    {
        b = s[i] - 'a';
        if ((c & (1 << b)) == 0)
        {
            s[j++] = s[i];
            c |= 1 << b;
        }
    }
    len_s = j;
}
           

方法二

#include <stdio.h>
#include <string.h>
char code_prepart[55], code[26], BUFF[1026];
void cut_similar(char pre_cut[], char after_cut[])
{
    for (int i = 0; i < strlen(pre_cut); i++)
    {
        for (int j = i - 1; j > -1; j--)
        {
            if (pre_cut[j] == pre_cut[i])
                pre_cut[i] = 1;
        }
    }
    for (int i = 0, j = 0; i < strlen(pre_cut); i++)
    {
        if (pre_cut[i] != 1)
        {
            after_cut[j] = pre_cut[i];
            j++;
        }
    }
}
void code_creat(char c[], char code[])
{
    cut_similar(c, code);
    int type = 0;
    for (int i = strlen(code), j = 1; i < 26;)
    {
        code[i] = 123 - j;
        type = 0;
        for (int k = 0; k < i; k++)
        {
            if (code[i] == code[k])
            {
                j++;
                type = 1;
                break;
            }
        }
        if (type == 0)
        {
            i++;
            j++;
        }
    }
}
int main()
{
    fgets(code_prepart, 55, stdin);
    for (int i = 0;; i++)
    {
        if (code_prepart[i] == '\r' || code_prepart[i] == '\n')
        {
            code_prepart[i] = '\0';
            break;
        }
    }
    code_creat(code_prepart, code);
    /*for (int i = 0; i < strlen(code); i++)
        printf("%c", code[i]);*/
    FILE *input_document = fopen("encrypt.txt", "r");
    FILE *output_document = fopen("output.txt", "w");
    int i = 0;
    while (fscanf(input_document, "%s", BUFF) != EOF)
    {
        int j = strlen(BUFF);
        if (i != 0)
            fputc(' ', output_document);
        for (int k = 0; k < j; k++)
        {
            if (BUFF[k] < 123 && BUFF[k] > 96)
                fputc(code[BUFF[k] - 'a'], output_document);
            else
                fputc(BUFF[k], output_document);
            BUFF[k] = '\0';
        }
        i++;
    }
    fclose(input_document);
    fclose(output_document);
    return 0;
}

           

BUAA?

继续阅读