C语言实现凯撒密码加解密

凯撒密码

  • 加密即把a-z或A-Z的字母向后移动n个字符实现加密,若n=3的话,a对应d,z对应c,如此循环;
  • 解密刚好和加密相反,加密向后移动的话解密就向前移动。
    加密的C代码如下:
#include 
void encode(char str[],int n)
{
	//使用两个数组分别存放大小写字符
	char min[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'};
	char max[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'};
	int i,k,m; 
	for(i=0;str[i]!='\0';i++)//判空条件也可以使用strlen(str)来获取str长度实现 
	{
		if('a'<=str[i] && str[i]<='z')
		{
			k=str[i]-'a';//使用k来获得当前字符对于字符a的偏离程度。若当前字符为a,则k=0,刚好符合字符数组min的下标
			m=(26+k+n)%26;//使用m来保存移动后的字符,对26取余数保证m始终位于0至25之间。若n为复数的话k+n可能小于0,因此在前面加上26保证其为正数。
			str[i]=min[m];
		}	
		else if('A'<=str[i] && str[i]<='Z')
		{
			k=str[i]-'A';
			m=(26+k+n)%26;
			str[i]=max[m];
		}		
	}		
}

int main()
{
	char a[10],ch;
	int n;
	printf("输入n值:");
	scanf("%d",&n);
	ch=getchar();
	printf("\n输入原始字符串:");
	gets(a);
	encode(a,n);
	printf("\n转换后:");
	puts(a);
	return 0;
}

解密的C代码如下:

#include 
void decode(char str[],int n)
{
	//使用两个数组分别存放大小写字符
	char min[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'};
	char max[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'};
	int i,k,m; 
	for(i=0;str[i]!='\0';i++)//判空条件也可以使用strlen(str)来获取str长度实现 
	{
		if('a'<=str[i] && str[i]<='z')
		{
			k=str[i]-'a';//使用k来获得当前字符对于字符a的偏离程度。若当前字符为a,则k=0,刚好符合字符数组min的下标
			m=(26+k-n)%26;//使用m来保存移动后的字符,由于k-n可能为负数因此在前面加上26保证其为正数。
			str[i]=min[m];
		}	
		else if('A'<=str[i] && str[i]<='Z')
		{
			k=str[i]-'A';
			m=(26+k-n)%26;
			str[i]=max[m];
		}		
	}		
}
int main()
{
	char a[10],ch;
	int n;
	printf("输入n值:");
	scanf("%d",&n);
	ch=getchar();
	printf("\n输入原始字符串:");
	gets(a);
	decode(a,n);
	printf("\n转换后:");
	puts(a);
	return 0;
}

你可能感兴趣的:(c语言,字符串)