问题描述:
这周的数据结构作业是对字符串进行加密和解密。
根据如下对应法则,对输入进行加密和解密并输出
{'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]
晚上看同学的代码,发现有些同学用两个字符串数组保存,大同小异把