如何采用换位法对一个英文句子进行加密和解密

如何把英文句子中的空格去除,然后将句子拍成若干行,每行的字符数为换位位数,再按列输出为密文,不足部分填入随机字母,如can you come here若换位数取4,则密文为comraueenchayoeb

这个加密好处理,一维数组转二维数组按列输出就可以了,但是添加随机字符后解密就不好解密了

运行结果:

img

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXLEN 10000
int main()
{
    char str[MAXLEN] = { 0 };
    int i = 0, j = 0;
    char tmp;
    int n;
    char** p;
    int len;
    const char* sr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; //用于生成随机字符
    srand(time(0));
    printf("请输入一行英文句子:\n");
    gets(str);//读取一行英文句子
    printf("请输入换位位数:");
    scanf("%d", &n);

    

    for (i = 0, j = 0; str[i] != '\0'; i++)
    {
        if (str[i] != ' ')
            str[j++] = str[i]; //过滤掉空格
    }
    
    len = j; //字符串长度
    if(len%4 == 0)
        str[j] = '\0'; //结束符
    else
    {
        for (i = 0; i < n - len % n; i++) //补齐不足的位数
            str[j++] = sr[rand() % 62]; //生成随机字符
        str[j] = '\0'; //结束符

    }
    len = j;

    p = (char**)malloc(sizeof(char*)*(len/n));
    for (i = 0; i < len / n; i++)
    {
        p[i] = (char*)malloc(n + 1);
        for (j = 0; j < n; j++)
            p[i][j] = str[i * n + j];
    }
    //按列输出
    for (j = 0; j < n; j++)
    {
        for (i = 0; i < len / n; i++)
            printf("%c", p[i][j]);
    }

    //释放内存
    for (i = 0; i < len / n; i++)
    {
        free(p[i]); p[i] = 0;
    }
    free(p);
    p = 0;

    return 0;
}

就是搞成二维数组呗

#include <stdio.h>
int main()
{
    srand(time(NULL));
    char s[1000];
    char k[30][30] = {0};
    gets(s);
    int i=0,j=0;
    while(s[i] != 0)
    {
        if(s[i] != ' ')
            s[j++] = s[i];
        i++;
    }
    s[j] = 0;
    //
    int col,row;
    scanf("%d",&col);
    row = j/col;
    if(j%col > 0)
        row++;
    i=0;
    for(int a=0;a<row;a++)
        for(int b=0;b<col;b++)
        {
            if(i<j)
                k[a][b] = s[i];
            else
                k[a][b] = rand()%26 + 'a';
            i++;
        }
    for(int a=0;a<col;a++)
        for(int b=0;b<row;b++)
            printf("%c",k[b][a]);
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632