C中的密文,如何重复关键字符

Cipher text in C,How to repeat key characters

明文:你好

密钥:CATCA

密文:KFFOP

并用密钥“FIDO”对明文“DOG”进行编码:

明文:DOG

密钥:FID

密文:JXK

要将两个字母相加,请使用以下约定:A=1, B=2, …, Z=26。如果两个字母的和大于 26,则从和中减去 26。例如:A + E = 1 + 5 = 6 = F,D + X = 4 + 24 = 28 = 2 = B。

帮帮我。

这是我的代码:

#include<stdio.h>
    #include<string.h>
    int main()
        {
            char str[100],k[50],str1[100];
            int i,n;
            gets(str);// Input plain text. 
            gets(str1);//Input key.
             for(i=0;str[i]!='[=10=]';i++)
                    {
                         n=(str[i]-65+1)+(str1[i]-65+1);//Extracting the numerical position and adding them.
                         if(n>26) //if numerical value exceeds 26 then subtracting 26 from it and getting the numerical value.
                          {
                             n=n-26;
                          }
                         str[i]=n+64;//storing the ciphered character.
                    }

              for(i=0;str[i]!='[=10=]';i++)//printing the ciphered characters.
              printf("%c",str[i]);
              return 0;

        }

在编写循环时,用于索引键的变量应重置为 0 以重复键(如果原始文本长度较大)。

for(int i = 0, j = 0; input[i] != '[=10=]'; ++i, ++j) {
    new_char = (input[i] - 64) + (key[j] - 64);
    new_char = adjust(new_char);
    cipher[i] = new_char + 64 ;
    if(j == (key_length - 2)) // if j is at the end, excluding null character, then make j = -1, which gets incremented to j = 0 in the next loop iteration
        j = -1;
}

也使用 fgets 进行字符串输入,不要 使用 gets。 C 中的字符串可以使用 %s 格式说明符打印,而无需编写显式循环来输出字符。为此,将 cipher char 数组的最后一个元素设为 [=14=] 字符。

您可以使用另一个循环变量,并在每次达到其长度时将键的索引设为 0。在这种情况下,我使用了变量 j。试试这个代码:

#include<stdio.h>
#include<string.h>
int main()
    {
        char str[100],k[50],str1[100];
        int i,n;
        gets(str);// Input plain text. 
        gets(str1);//Input key.
        int lenk=strlen(str1),j;   //calculate length of key
         for(i=0,j=0;str[i]!='[=10=]';i++,j++)
    {
         if(j==lenk) j=j-lenk;      //make j=0
         n=(str[i]-65+1)+(str1[j]-65+1);    // add str1[j] instead
         if(n>26) 
          {
             n=n-26;
          }
         str[i]=n+64;//storing the ciphered character.

    }

          for(i=0;str[i]!='[=10=]';i++)
          printf("%c",str[i]);
          return 0;

    }

请注意,这仅适用于大写字母,您必须更改小写字母的代码

您也可以使用模运算来重复字符。

for(i=0;str[i]='[=10=]';i++)
{
    n = (str[i]-65+1 + (str1[i % lenk]-65 +1);    
    n = (n % 26) + 1;
    str[i] = n+64;
    //storing the ciphered character.

}

表达式 i % 26 自动将值从 0 循环到 25。

这同样适用于将 n 从 1 旋转到 26。