Vigenere BaZ 关键挫折

Vigenere BaZ key frustration

我已经解决了很多关于 Vigenere 问题的堆栈和 reddit 问题。我快弄明白了,我可以尝尝了!

过去几个小时我一直在处理 BaZ 密钥的问题,我已经准备好了。我的 cs50 检查 returns:

:( 使用 "BaZ" 作为关键字将 "BaRFoo" 加密为 "CaQGon"

\ 预期输出,但不是 "CBzSREpon\n"

我已经检查了键的大写和小写,并尽可能有条理地完成了所有事情。在这一点上,我盯着屏幕看的时间太长了,我错过了一些东西。

这是我的代码:

for (i = 0, l = strlen(p); i < l; i++)
{
    if (isalpha(p[i]))
    {
        if (isupper(p[i]) && isupper(k[n]))
        {
            int c = (p[i] - 65 + ((k[n]) - 65)) % 26;
            printf("%c", c + 65);
            n++;
        }
        if (isupper(p[i]) && islower(k[n]))
        {
            int c = (p[i] - 65 + (k[n] - 97)) % 26;
            printf("%c", c + 65);
            n++;
        }
        if (islower(p[i]) && islower(k[n]))
        {
            int c = (p[i] - 97 + (k[n] - 97)) % 26;
            printf("%c", c + 97);
            n++;
        }
        if (islower(p[i]) && isupper(k[n]))
        {
            int c = (p[i] - 97 + ((k[n]) - 65)) % 26;
            printf("%c", c + 97);
            n++;
        }
        if (n == g)
            n = 0;
    }
    if (!isalpha(p[i]))
    {
        printf("%c", p[i]);
    }
}
printf("\n");

return 0;

我错过了什么?在我秃头之前,请有人帮助我!

您为一个字母提供了多个输出。您必须在第一个 "if" 之后使用 "else if"。或者在第一个大 if 块的末尾创建 n++ 。在第一个内部 if 块中递增 n 可能会导致它进入第二个 if 块,因为 k[n] 发生变化。