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

Vigenere failed test :( encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword

有人可以用我的代码帮助我解决上面的这个错误吗?我搜索了答案,但它们与我的代码有点不同。

#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;
    }
}

您的代码正确处理了明文中的大小写字母,但没有正确处理关键字中的不同大小写字母。当您处理大写明文字母时,您从关键字字母中减去 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])