#include<stdio.h>
#include<stdlib.h>
#define INIT_KE_LEN 20
#define KE_INCREMA_LEN 10
#define INIT_PT_LEN 100
#define PT_INCREMA_LEN 10
void main(){
int i=0,j=0,k=0,m=0;
char *ke1,*p,*pt,*ke;
int pt_len=0,ke_len=0;
char ch;
char r[10]="dffrg";
int line=0,rem=0;
int k_tmp;
char char_tmp;
int *order;
int k_clength=0,p_clength=0;
ke = (char *)malloc(INIT_KE_LEN* sizeof(char));
pt = (char *)malloc(INIT_PT_LEN * sizeof(char));
k_clength=INIT_KE_LEN ;
p_clength=INIT_PT_LEN;
ch=getchar();
//输入密钥
p=ke;
printf("输入密钥!/n");
while(((ch=getchar()) != EOF) && (ch != '/n') && (ch != '/t')&& (ch != ' ')){
if(ke_len - k_clength >= INIT_KE_LEN + 20){
if((ke=(char *)realloc(ke,(k_clength+ KE_INCREMA_LEN))) ==NULL)
exit(0);
k_clength+=KE_INCREMA_LEN;
}
*p++=ch;
ke_len++;
}
*p='/0';
//密钥排序
ke1=(char *)malloc(ke_len * sizeof(char));//复制一份密钥 用于排序
order = (int *)malloc(ke_len * sizeof(int));//存放密钥字符顺序
for(i=0;i<ke_len;i++){
ke1[i]=ke[i];
}
for(i=0;i<ke_len;i++){
for(m=0;m<ke_len;m++){
if(ke1[m] != -1){
char_tmp=ke1[m];
k_tmp=m;
break;
}
}
for(j=k_tmp;j<ke_len;j++){
if((ke1[j] != -1) &&(char_tmp > ke1[j])){
char_tmp=ke1[j];
k_tmp=j;
}
}
order[i] = k_tmp;
ke1[k_tmp]=-1;
}
p=pt;
printf("输入加密文字: /n");
while(((ch=getchar()) != EOF) && (ch != '/n') && (ch != '/t')){
if(pt_len - k_clength >= INIT_PT_LEN + 20){
if((pt=(char *)realloc(ke,(p_clength+ PT_INCREMA_LEN))) ==NULL)
exit(0);
p_clength+=PT_INCREMA_LEN;
}
*p++=ch;
pt_len++;
}
*p='/0';
line = pt_len/ke_len;
rem = pt_len % ke_len;
printf("加密结果:/n");
k=0;
for(i=0;i<ke_len;i++){
k=order[i];
if(k>=rem){
for(j=0;j<line;j++){
printf("%c",pt[k]);
k+=ke_len;
}
}else{
for(j=0;j<=line;j++){
printf("%c",pt[k]);
k+=ke_len;
}
}
}
printf("/n");
free(pt);
}