Vigenere测试失败:(使用“ BaZ”作为关键字将“ BaRFoo”加密为“ CaQGon”

时间:2018-12-06 00:50:52

标签: c cs50 vigenere

有人可以帮助我解决我的代码吗?我已经搜索了答案,但与我的代码有些不同。

  • vigenere.c编译。
  • 使用“ a”作为关键字将“ a”加密为“ a”
  • 使用“ baz”作为关键字将“ barfoo”加密为“ caqgon”
  • 使用“ BaZ”作为关键字将“ BaRFoo”加密为“ CaQGon”
    失败预期为“密文:CaQ ...”,而不是“密文:CaQ ...”
  • 使用“ BAZ”作为关键字将“ BARFOO”加密为“ CAQGON”
  • 加密“ world!$?”为“ xoqmd!$?”使用“ baz”作为关键字
  • 加密“你好,世界!”如“ iekmo,vprke!”使用“ baz”作为关键字
  • 处理缺少argv [1]
    失败由于分段错误而无法执行程序
  • 处理argc> 2
  • 拒绝将“ Hax0r2”作为关键字

#include<stdio.h>
#include<cs50.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>


int main(int argc,string argv[])
{
    for (int k = 0;k<strlen(argv[1]);k++)
    {
        if (isalpha(argv[1][k]))
        {}
        else
        {
            return EXIT_FAILURE;
        }
    }
    if (argc == 2)
    {
        int alpha,cipher,key,j=0,len=strlen(argv[1]);
        char a;
        string plaintext = get_string("Text: ");
        printf("ciphertext: ");
        for (int i = 0; i<strlen(plaintext) ; i++)
        {
            if (isalpha(plaintext[i]))
            {
                if (isupper(plaintext[i]))
                {
                    alpha = plaintext[i]-65;
                    key = argv[1][j]-65;
                    cipher = (key+alpha)%26;
                    a = (char) cipher+65;
                    printf("%c",a);
                    j=(j+1)%len;

                }
                else if (islower(plaintext[i]))
                {
                    alpha = plaintext[i]-97;
                    key = argv[1][j]-97;
                    cipher = (key+alpha)%26;
                    a = (char) cipher+97;
                    printf("%c",a);
                    j=(j+1)%len;
                }

            }
            else
            {
                printf("%c",plaintext[i]);
            }
        }
        printf("\n");
    }
    else
    {
        printf("error\n");
        return EXIT_FAILURE;
    }
}

1 个答案:

答案 0 :(得分:0)

您的代码可以正确处理纯文本中的大写和小写字母,但不能正确处理关键字中的不同大小写字母。处理大写的纯文本字母时,即使关键词可能不是大写,也要从关键词中减去65

您只需将所有关键字字母转换为普通字母,然后从中减去相应的第一个字母即可得到增加的数量。

也不需要检查islower() -如果不是大写字母,则必须是小写字母。因此,只需使用else

            if (isupper(plaintext[i]))
            {
                alpha = plaintext[i]-'A';
                key = toupper(argv[1][j])-'A';
                cipher = (key+alpha)%26;
                a = (char) cipher+'A';
                printf("%c",a);
                j=(j+1)%len;

            }
            else
            {
                alpha = plaintext[i]-'a';
                key = toupper(argv[1][j])-'A';
                cipher = (key+alpha)%26;
                a = (char) cipher+'a';
                printf("%c",a);
                j=(j+1)%len;
            }

要解决由于缺少argv[1]而引起的细分错误,请移动循环,以检查关键字在if (argc == 2)块内是否全部为字母。然后,您还可以使用len变量,而不是在循环中重复strlen(argv[1])