CS50--Week2:Encrypt


1.通过将其中的每个字母都移动相同的位置来“加密”,要求大写字母还是大写,小写还是小写,其他字符保持不变。

示例如下:

 c中没有字符串变量,利用字符数组,再针对大小写分别加密设置即可。

#include 
//加密
void main()
{
    int total_c = 30;
    char str1[30];
    char str2[30];
    int cipher = 13;//密码
    //初始化
    cipher = cipher % 26;
    for (int k = 0; k < total_c; k++)
    {
        str1[k] = '\0';
        str2[k] = '\0';
    }
    gets(str1);
    for (int i = 0; i < total_c; i++)
    {
        if (str1[i] >= 65 && str1[i] <= 90)//大写字母
        {
            if ((int)str1[i] + (int)cipher < 65 || (int)str1[i] + (int)cipher > 90)//判断是否超出字母限制
                str2[i] = str1[i] + cipher - 'Z' + 'A' - 1;
            else
                str2[i] = (char)((int)str1[i] + (int)cipher);
        }

        else if (str1[i] >= 97 && str1[i] <= 122)//小写
        {
            if ((int)str1[i] + (int)cipher < 97 || (int)str1[i] + (int)cipher > 122)
                str2[i] = (char)((int)str1[i] + (int)cipher - (int)'z' + (int)'a' - 1);
            else
                str2[i] = (char)((int)str1[i] + (int)cipher);


        }

        else
            str2[i] = str1[i];


        printf("%c", str2[i]);

    }

}

运行结果:

2.根据上面进一步拓展,如果每位字母移动不同的位数时如何?如下图,假设输入明文为HELLO,密码输入ABC(或abc),ABC.....Z(或abc.....z)分别代表0,1,2.....25,则可以得到密文为HFNLP。

 这可以在1中的程序上拓展,这时的密码不能再设成int型,需要利用字符数组来存放。由于密码位数不知道因此需要获取密码的位数及每位对应的值,这里每位对应的值还是如上面一样ABC.....Z分别代表0,1,2.....25,依次循环对明文进行加密,这里需要注意只对大小写字母加密,而不对空格或者标点等其他进行加密。

#include 

//加密2.0
int main()
{
    int total_c = 30;//数组位数
    char str1[30];
    char str2[30];
    char cipher[30];//密码
    int cipher_after[30];//类推后的密码
    //初始化
    for (int k = 0; k < total_c; k++)
    {
        str1[k] = '\0';
        str2[k] = '\0';
        cipher[k] = '\0';
    }
    printf("plaintext:");//明文
    gets(str1);
    printf("cipher:");//密码
    gets(cipher);

    //获取密码位数n
    int n = 0;
    while (cipher[n] != '\0')
    {
        n++;
    }

    //获取每位密码:a/A=0;b/B=1;以此类推;
    for (int i = 0; i < total_c; i++)
    {
        if (cipher[i] >= 65 && cipher[i] <= 90)//大写65--90
            cipher_after[i] = (int)cipher[i] - 65;
        else
            cipher_after[i] = (int)cipher[i] - 97;
    }


    int k = 0;//表示第几位密码
    for (int i = 0; i < total_c; i++)
    {
        
        if (str1[i] >= 65 && str1[i] <= 90)//大写字母
        {
            if ((int)str1[i] + (int)cipher_after[k] < 65 || (int)str1[i] + (int)cipher_after[k] > 90)//判断是否超出母限制
                str2[i] = str1[i] + cipher_after[k] - 'Z' + 'A' - 1;//超过则进行修改
            else
                str2[i] = (char)((int)str1[i] + (int)cipher_after[k]);//不超过就直接输出

            //对k进行修改
            if (k < n - 1)
                k++;
            else
                k = 0;

        }
        else if (str1[i] >= 97 && str1[i] <= 122)//小写
        {
            if ((int)str1[i] + (int)cipher_after[k] < 97 || (int)str1[i] + (int)cipher_after[k] > 122)
                str2[i] = (char)((int)str1[i] + (int)cipher_after[k] - (int)'z' + (int)'a' - 1);
            else
                str2[i] = (char)((int)str1[i] + (int)cipher_after[k]);

            //对k进行修改
            if (k < n - 1)
                k++;
            else
                k = 0;


        }
        else
            str2[i] = str1[i];

        printf("%c", str2[i]);

    }

    return 0;

}

运行结果:

题目来源:https://docs.cs50.net/2019/x/psets/2/index.html