任务是在运行程序时给出一个关键字参数,我将其保存为string k然后用户输入文本,程序将根据关键字输出输入的文本。A=0,B=1,所以如果关键字是ABABA,文本是hello,它将输出hflmo。
如果我将argv[1]作为“abc”运行程序,然后将明文pt作为“hello”,我应该得到“hfnlp”,但是我得到的是“hnflv”,为什么最后一个字母加密不正确?

    string k = argv[1];
    int l = strlen(argv[1]);
    printf("plaintext: ");
    string pt = get_string("");
    printf("ciphertext: ");
    for (int i = 0, shift = 0; i < strlen(pt); i++)
    {
        if (!isalpha(pt[i]))
        {
            printf("%c", pt[i]);
        }
        else
        {
            if (isupper(pt[i]))
            {
                if (isupper(k[shift]))
                {
                    printf("%c", (((pt[i] - 65) + (k[shift % l] - 65)) %26) + 65);
                    shift++;
                }
                else
                {
                    printf("%c", (((pt[i] - 65) + (k[shift % l] - 97)) %26) + 65);
                    shift++;
                }
            }
            else if (islower(pt[i]))
            {
                if (isupper(k[shift]))
                {
                    printf("%c", (((pt[i] - 97) + (k[shift % l] - 65)) %26) + 97);
                    shift++;
                }
                else
                {
                    printf("%c", (((pt[i] - 97) + (k[shift % l] - 97)) %26) + 97);
                    shift++;
                }
            }
        }
    }
    printf("\n");
    return 0;
}

最佳答案

台词

if (isupper(k[shift]))

缺少模计算。正确的版本是:
if (isupper(k[shift % l]))

如果将此计算放在for-循环的某个中心位置,可能会更清楚:
shift %= l;

关于c - Vigenere错误的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58705036/

10-11 23:01
查看更多