[任务是在运行程序时提供关键字参数,我将其保存为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;