凯撒密码重复字母

时间:2016-04-11 13:31:38

标签: c cs50 caesar-cipher

基本上我必须创建一个caesar密码,它只用一个字母“int”来替换每个字母。这需要2个命令行参数:'。/ caesar'和'k',由用户给出。它工作正常;但有一个问题:

它使用3作为正确的密钥将“BARFOO”加密为“EDUIRR”    使用4作为正确的密钥将“BaRFoo”加密为“FeVJss”

但它没有使用65作为密钥将“barfoo”加密为“onesbb”,它将其加密为“oonneess | bb | bb”。

请注意标点符号;大写等等。

在这里查看问题?它也可以用于其他随机词;它重复了一些信件。帮助我....

PS:我对编程非常陌生,你可以在我的代码中看到,所以请尝试用英语解释!

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
string s;
//int d;
int c;
int a;
if(argc != 2)
{   
    printf("Please run with a command line argument.");
    return 1;
}
else
{
    s = GetString();
}
int k = atoi(argv[1]);

for(int i = 0; i < strlen(s); i++)
    {
       a = s[i];
       if(a<'A'||a>'z')
       {
           printf(" ");
       }
       else
       {
           if(a>='A'&&a<='Z')
           {
               c = a+k;
               while(c>'Z')
               {
                   c = 'A'+(c-'Z')-1;
                   printf("%c", c);
               }

               if(c<='Z')
               {
                   printf("%c", c);
               }
           }
           else if(a>-'a'&&a<='z')
           {
               c = a+k;
               while(c>'z')
               {
                   c = 'a'+(c-'z')-1;
                   printf("%c", c);
               }
               if(c<='z')
               {
                   printf("%c", c);
               }
           }
       }
    }
printf("\n");
}

2 个答案:

答案 0 :(得分:2)

您可以尝试使用k%26因为它应该包裹字母表的字符。 这应该可以解决你的问题。

答案 1 :(得分:1)

你应该这样试试。以大写字母为例。首先从字母“A&#39;”中获取索引。 index = a - 'A';

然后在变量k中添加值,并在除以26时得到余数。

modified_index = ( index + k ) % 26;

现在要获得所需的字母,只需添加'A'

c = 'A' + modified_index;

只有添加k%26才会有帮助,因为'z'的增量1会变为{,这是错误的。

此外,如果您只是在k中添加带有变量a表示的字母的值,它可能会超出Joulin所提到的ASCII字符的限制。