字符串-加密与解密

来源:互联网 发布:数据挖掘工程师的作用 编辑:程序博客网 时间:2024/05/01 00:20

问题描述:

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

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

 {'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 50int 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 0
原创粉丝点击