请问谁能看下这个问题

密码学中,凯撒密码(Caesar Cipher)是一种最简单的加密技术 其核心思想是替换加密。即将输入的字母根据字母表上的顺序 向前或向后偏移固定的数目,形成密文。如:向后偏移2位 则 A 变成 C(相当于 'A'+2)。进一步扩展,可以将字母表中的 A-Z a-z 0-9 扩展为大循环 形成 A B ~ Z a b ~ z 0 1 ~ 9 A B ~ Z为基础的链,用以进行映射。

修改为支持整串文字加密的“凯撒加密”
1)定义字符数组 char input[N] 保存输入的文字

2)定义字符数组 char output[N] 保存转换后的文字

3)使用scanf或getchar循环获取输入的整串文字,并保存在 input 数组

4)执行凯撒加密

5)输出字符保存在 output 数组

6)整行打印转意后的字符

例如:

input pos num(-5<pos<5): 3

input string: Hello the world!

output string:Khoor wkh zruog!

img

#include<stdio.h>
#include<string.h>
// 字符串缓冲区大小
#define N 1024
// 声明凯撒加密函数
void caesar_cipher(char input[N], int offset, char output[N]);
int main()
{
    // 1)定义字符数组 char input[N] 保存输入的文字
    int offset;
    char input[N] = { 0 };
    // 2)定义字符数组 char output[N] 保存转换后的文字
    char output[N] = { 0 };
    // 3)使用gets获取输入的整串文字,并保存在 input 数组
    printf("input pos num(-5<pos<5): ");
    scanf("%d", &offset);
    printf("input string: ");
    gets(input); // 跳过回车
    gets(input);
    // 4)执行凯撒加密 并且 5)将输出字符保存在output数组
    caesar_cipher(input, offset, output);
    // 6)整行打印转意后的字符
    printf("output string:%s ", output);
}

void caesar_cipher(char input[N], int offset, char output[N])
{
    const char* table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    while (*input)
    {
        int cnt = 0;
        const char* tmp = table;
        while (*tmp && *tmp != *input)
        {
            ++cnt;
            ++tmp;
        }
        char ch = *tmp != *input ? *input : table[(cnt + offset + (int)strlen(table)) % (int)strlen(table)];
        *output = ch;
        ++input;
        ++output;
    }
    *output = 0;
}

可以参考一下




/*

思路:
    1、while无线循环,声明两个字符数组:保存明文和密文
    2、首次用户输入字符串,进行明文加密成密文操作
    3、之后用户输入命令字符实现判断:输入:“1”加密新的明文,输入:“2”对刚加密的密文进行解密,输入:“3”退出
*/

#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{

    int count = 0;
    int result = 1;
    int i;
    char Text[128] = {'\0'};       // 定义一个明文字符数组
    char crytograph[128] = {'\0'}; // 定义一个密文字符数组
    while (1)
    {
        /* code */
        if (result == 1)
        {
            /* code */
            printf("请输入要加密的明文:");
            scanf("%s", &Text);
            count = strlen(Text);
            for (i = 0; i < count; i++) // 遍历明文
            {
                /* code */
                crytograph[i] = Text[i] + i + 5; //设置加密字符
            }
            crytograph[i] = '\0'; // 设置字符串结束标记
            /*输出密文信息*/
            printf("加密后的密文是:%s\n", crytograph);
        }
        else if (result == 2) // 如果是解密字符串
        {
            count = strlen(Text);
            for (i = 0; i < count; i++) // 遍历密文字符串
            {
                /* code */
                Text[i] = crytograph[i] - i - 5; // 设置解密字符
            }
            Text[i] = '\0';
            /*输出明文信息*/
            printf("解密后的明文是:%s\n", Text);
        }
        else if (result == 3)
        {
            break; // 跳出循环
        }
        else
        {
            printf("请输入命令符:"); // 输出字符串
        }

        /*输出字符串*/
        printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");
        printf("请输入命令符:\n");
        scanf("%d", &result);
    }

    return 0;
}


代码如下:

#include<stdio.h>
#include<string.h>

int main()
{
    char s[100];
    int n;//移动步长
    scanf_s("%d", &n);
    getchar();
    gets(s);
    int len = strlen(s);
    for (int i = 0; i < len; i++)
    {
        if (s[i] >= 'A' && s[i] <= 'Z')
        {
            if (s[i] + n <= 'Z')
                s[i] += n;
            else
                s[i] += (n + 6);  //从大写接到小写
        }
        else if (s[i] >= 'a' && s[i] <= 'z')
        {
            if (s[i] + n <= 'z')
                s[i] += n;
            else
                s[i] += (n -75);  //从小写接到数字
        }
        else if (s[i] >= '0' && s[i] <= '9')
        {
            if (s[i] + n <= '9')
                s[i] += n;
            else
                s[i] += (n +7);  //从数字接到大写
        }
    }
    puts(s);
    return 0;
}

结果:

img

思路如下

char input[N]
char output[N]
for(int i=0;i<input.length;i++){
output[i]=input[i]+2;
print(out【i】) 不换行打印
}