换位加密,字符串怎么去空格和怎么读取(保存进去)文件
我自己的问题是不会去空格和不会和文件互动下面的是我自己捣鼓出来的(新人不太会,最好有兄弟给我一个全新的代码)
原问题
1)要求:
(1)采用换位法进行加密和解密;
(2)输入英文句子后,再输入换位位数(密钥),即可输出密文;
(3)输入密文后再输入换位位数则可输出明文;
(4)在此基础上,可进行文件操作。
2)涉及的内容或知识点:
内容:需求分析、概要设计、详细设计、程序调试、说明书撰写;
知识点:C语言的基本语法、结构化程序设计、数组、函数、结构体、指针等。
注:换位法加密的原理是将英文句子中的空格去除,然后将句子排成若干行,每行的字符数为换位位数,再按列输出即为密文,不足部分填入随机字母。
例如英文Can you come here若换位位数取4,则密文为comraueenchayoeb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *jiami(char *str,int n)
{
int i,j,k,d;
int len;
char *temp,*miwen,*mtemp;
len=strlen(str);
if((d=len%n)!=0)
{
len=len+n-d;
}
if((temp=(char *)malloc(len+1))==NULL)
{
printf("申请内存失败!\n");
exit(1);
}
if((miwen=(char *)malloc(len+1))==NULL)
{
printf("申请内存失败!\n");
exit(1);
}
else
{
mtemp=miwen;
}
strcpy(temp,str);
for(i=strlen(str);i<len;i++)
{
temp[i]=32;
}
temp[len]='\0';
for(k=0;k<n;k++)
{
for(j=0;j<len/n;j++)
{
*mtemp=temp[k+j*n];
mtemp++;
}
}
*mtemp='\0';
free(temp);
return miwen;
}
char *jiemi(char *str,int n)
{
int i,j,k,d;
int len;
char *temp,*mingwen,*mtemp;
len=strlen(str);
if((d=len%n)!=0)
{
len=len+n-d;
}
n=len/n;
if((temp=(char *)malloc(len+1))==NULL)
{
printf("申请内存失败!\n");
exit(1);
}
if((mingwen=(char *)malloc(len+1))==NULL)
{
printf("申请内存失败!\n");
exit(1);
}
else
{
mtemp=mingwen;
}
strcpy(temp,str);
for(i=strlen(str);i<len;i++)
{
temp[i]=32;
}
temp[len]='\0';
for(k=0;k<n;k++)
{
for(j=0;j<len/n;j++)
{
*mtemp=temp[k+j*n];
mtemp++;
}
}
while(*(--mtemp)==32);
mtemp++;
*mtemp='\0';
return mingwen;
}
void main()
{
int n,t;
char srcstr[100];
char *miwen;
char *mingwen;
printf("输入1或0选择输入明文或密文。");
scanf("%d",&t);
if (t=1)
{
printf("请输入秘钥:");
scanf("%d",&n);
fflush(stdin);
printf("请输入明文:");
gets(srcstr);
miwen=jiami(srcstr,n);
printf("输入的明文是:%s\n",srcstr);
printf("加密的密文是:%s\n",miwen);
}
else
{
fflush(stdin);
printf("请输入秘钥:");
scanf("%d",&n);
fflush(stdin);
printf("请输入密文:");
gets(srcstr);
mingwen=jiemi(srcstr,n);
printf("输入的密文是:%s\n",srcstr);
printf("解密的明文是:%s\n",mingwen);
}
}