字符串-加密与解密

问题描述:

这周的数据结构作业是对字符串进行加密和解密。

根据如下对应法则,对输入进行加密和解密并输出

 {'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'}
 {'n','g','z','q','t','c','o','b','m','u','h','e','l','k','p','d','a','w','x','f','y','i','v','r','s','j'}


代码:

1,encryption.h

文件中定义了结构体和相关函数的接口。

#ifndef ENCRYPTION_H_INCLUDED
#define ENCRYPTION_H_INCLUDED
#include "encryption.h"
#define MAXSIZE 50
int get_index(char* a,char *p);
/************************
顺序串数据结构定义
顺序串大致是在一片连续存储空间中存储的字符
整型变量str_len标明了该结构中含有的字符个数
************************/
typedef struct
{
    char str[MAXSIZE];
    int str_len;
} SqStr;

/************************
通过字符串指针初始化顺序串函数
************************/
SqStr* init_by_char_index(SqStr* sqs,char* s)
{
    int i=0;
    sqs=(SqStr*)malloc(sizeof(SqStr));
    char* p=sqs->str;
    while(*s!='\0')
    {
        *p++=*s++;
        i++;
    }
    sqs->str_len=i;
    return sqs;
}

/************************
字符串加密函数
参数1:需要进行加密的顺序串指针
参数2:加密参照的转换规则(在这个程序里用一个二维数组保存转换规则)
返回加密后的顺序串
************************/
SqStr* encryption(SqStr* before_sqs,char (*p)[26])
{
    SqStr* after_sqs=(SqStr*)malloc(sizeof(SqStr));
    char* before_str=before_sqs->str;
    char* after_str=after_sqs->str;
    int i,index;
    for(i=0;i<before_sqs->str_len;i++)
    {
        index=get_index(before_str,*p);
        if(index!=-1)
        {
            *after_str=*(*(p+1)+index);
            before_str++;
            after_str++;
        }
        else
            *after_str++=*before_str++;
    }
    after_sqs->str_len=before_sqs->str_len;
    return after_sqs;
}

/************************
字符串加密函数
参数1:需要进行解密的顺序串指针
参数2:解密参照的转换规则
返回解密后的顺序串
************************/
SqStr* decryption(SqStr* before_sqs,char (*p)[26])
{
    SqStr* after_sqs=(SqStr*)malloc(sizeof(SqStr));
    char* before_str=before_sqs->str;
    char* after_str=after_sqs->str;
    int i,index;
    for(i=0;i<before_sqs->str_len;i++)
    {
        index=get_index(before_str,*(p+1));
        if(index!=-1)
        {
            *after_str=*(*p+index);
            before_str++;
            after_str++;
        }
        else
            *after_str++=*before_str++;
    }
    after_sqs->str_len=before_sqs->str_len;
    return after_sqs;
}

/************************
得到参数1在转换表中对应的下标(偏移量)
大致想法:
因为表是char[2][26],可以看成由两个一维数组组成,分别对应转换前和转换后
加密时,只需将需加密的当前字符和转换'前'一维数组作参数传递,该函数返回当前字母在一维数组中的下标。
在调用函数(即加密函数)中根据下标找到转换后一维数组对应的字符,即可完成转换
解密原理相同,将需解密的当前字符和转换'后'一维数组作参数传递即可
************************/
int get_index(char* a,char *p)
{
    int index=-1,i;
    for(i=0;i<26;i++)
    {
        if(*a==*p || *a==*p-32)
               return i;
        p++;
    }
    return index;
}

/************************
打印顺序串函数
************************/
void printf_SqStr(SqStr* sqs)
{
    int i;
    char* p=sqs->str;
    for(i=0;i<sqs->str_len;i++)
            printf("%c",*p++);
    printf("\n");
}
#endif // ENCRYPTION_H_INCLUDED

2,main.c

测试程序,完成功能

/* 
* Copyright (c) 2014, 烟台大学计算机与控制工程学院 
* All rights reserved. 
* 文件名称:main.c && encryption.h 
* 作    者:何小乐 
* 完成日期:2016年 4 月 18 日 
* 版 本 号:v1.0 
* 
* 问题描述:对字符串进行加密解密并输出 
*/  
#include <stdio.h>
#include <stdlib.h>
#include "encryption.h"
int main()
{
    SqStr* before_encrypt_sqs,*after_encrypt_sqs,*after_decrypt_sqs,*before_decrypt_sqs;
    char *input=(char*)malloc(sizeof(char)*50);
    printf("please input the string what need to encrypted :");
    gets(input);
    before_encrypt_sqs=init_by_char_index(before_encrypt_sqs,input);
    char transform_table[2][26]=
    {
        {'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'},
        {'n','g','z','q','t','c','o','b','m','u','h','e','l','k','p','d','a','w','x','f','y','i','v','r','s','j'}
    };
    printf("before encrypt,the string is : ");
    printf_SqStr(before_encrypt_sqs);
    after_encrypt_sqs=encryption(before_encrypt_sqs,transform_table);
    printf("after encrypt,the string is : ");
    printf_SqStr(after_encrypt_sqs);
    printf("--------------------------------------\n");
    printf("before decrypt,the string is : ");
    printf_SqStr(after_encrypt_sqs);
    after_decrypt_sqs=decryption(after_encrypt_sqs,transform_table);
    printf("after decrypt,the string is : ");
    printf_SqStr(after_decrypt_sqs);
    printf("what do you real love???\n");
    gets(input);
    before_decrypt_sqs=init_by_char_index(before_decrypt_sqs,input);
    after_decrypt_sqs=decryption(before_decrypt_sqs,transform_table);
    printf("after decrypt..\n");
    printf_SqStr(after_decrypt_sqs);
    return 0;
}

运行结果:



小结:

这周的作业相对思考量要求较少

在写的时候,知道了sacnf在接收输入时不能接收空白符,得用gets函数

刚开始写的时候,用的是26个switch语句实现的加密,后来想下解密同样要写26个switch,就重新整理了下思路

然后用char[26][2]数组保存转换规则,后来发现还是挺麻烦的,最后决定用char[26][2]

晚上看同学的代码,发现有些同学用两个字符串数组保存,大同小异把


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值