9.14.14-PointersOnC-20220303

//原先的加密方法太简单,给其加码,原始key中单个字母重复次数使其在key数组补全后与另一个字母进行换位,每个字母重复次数累计值如为奇数,key数组顺时针移动该累计值的位数,偶数为逆时针
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char *my_fgets(char *p,int n);
int prepare_key(char *key);
void encrypt_key(char *data,char *key);
void decrypt_key(char *data,char *key);
int main(){
	char key_origin[27]={0};
	char alphabet[27]={0};
	char key[27]={0};
	char str[27]={0};
	for(char i=0;i+'A'<='Z';*(alphabet+i)=i+'A',i++);
	fputs("Input the origin key:->",stdout);
	if(my_fgets(key_origin,27)){
		strcpy(key,key_origin);
		prepare_key(key);
	}
	else
		for(char i=0;i+'A'<='Z';*(key+i)=i+'A',i++);
	for(fputs("Input the str:->\n",stdout);my_fgets(str,27)&&*str;fputs("Input the str:->\n",stdout)){
		encrypt_key(str,key);
		printf("The alphabet is:\n%s\n",alphabet);
		printf("The key is:\n%s\n",key);
		printf("The str after encrypted:\n%s\n",str);
		decrypt_key(str,key);
		printf("The str after decrypted:\n%s\n",str);
	}
	fputs("OVER\n",stdout);
return 0;}
//
char *my_fgets(char *p,int n){
	char ch=0,*input=NULL,*found=NULL;
	if(input=fgets(p,n,stdin))
		if(found=strchr(input,10))
			*found=0;
		else
			while((ch=getchar())!=EOF&&ch!=10);
return input;}

int prepare_key(char *key){
	if(!key) return 0;
	for(char *ptemp=key;*ptemp;*ptemp=toupper(*ptemp),ptemp++)
		if(!isalpha(*ptemp))
			return 0;
	char str_add[27]={0};
	int sum_add=0;
	for(int i=0;*(key+i);i++){
		for(int j=i;*(key+j);j++){
			if(i!=j&&*(key+i)==*(key+j)){
				for(int k=j;*(key+k);*(key+k)=*(key+k+1),k++);//key数组重复位覆盖
				(*(str_add+i))++;
				j--;
			}
		}
	}
	for(char *key_rear=key+strlen(key),character='A';character<='Z';character++){//key数组补全
		for(char *key_temp=key;*key_temp;key_temp++){
			if(character==*key_temp)
				character++;		
		}
		*key_rear=character;
		*++key_rear=0;
	}
	for(int i=0;*(key+i);i++){//根据字母重复的次数对该字母进行换位
		if(*(str_add+i)){
			int temp=*(key+i);
			*(key+i)=*(key+26-(i+*(str_add+i))%26);
			*(key+26-(i+*(str_add+i))%26)=temp;
			sum_add+=*(str_add+i);
		}
	}
	if((sum_add%=26)%2){//如重复次数和为奇数,顺时针移动
		char str_temp[27]={0};
		strcpy(str_temp,key+26-sum_add);
		strncat(str_temp,key,26-sum_add);
		strcpy(key,str_temp);
	}
	else{//如重复次数和为偶数,逆时针移动
		char str_temp[27]={0};
		strcpy(str_temp,key+sum_add);
		strncat(str_temp,key,sum_add);
		strcpy(key,str_temp);
	}
return 1;}

void encrypt_key(char *data,char *key){
	for(;*data;data++){
		if(islower(*data))
			*data=tolower(*(key+(*data-'a')));
		else if(isupper(*data))
			*data=*(key+(*data-'A'));
	}
}

void decrypt_key(char *data,char *key){
	char alphabet[27]={0};
	for(char i=0;i+'A'<='Z';*(alphabet+i)=i+'A',i++);
	for(;*data;data++){
		if(islower(*data)){
			for(int i=0;*(key+i);i++){
				if(toupper(*data)==*(key+i)){
					*data=tolower(*(alphabet+i));
					break;//不要漏了break
				}
			}
		}
		else if(isupper(*data)){
			for(int i=0;*(key+i);i++){
				if(*data==*(key+i)){
					*data=*(alphabet+i);
					break;
				}
			}
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fleet1126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值