c - Vigenere 给出错误的结果
问题描述
任务是在运行程序时给出一个关键字参数,我将其保存为string k
然后用户输入文本,程序将根据关键字输出输入的文本。A = 0, B = 1,所以如果关键字是ABABA,文本是hello,就会输出hflmo。
如果我argv[1]
以“abc”运行程序,然后以“hello”运行明文pt
,我应该得到“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
-loop 的某个中心位置,可能会更清楚:
shift %= l;
推荐阅读
- java - 概括规则:哪些操作总是会导致 IOException?
- react-native-ios - 架构 armv7 的未定义符号:YGConfig
- image - 在python中绘制灰度图像直方图的问题
- jekyll - 如何默认隐藏所有页面[已发布:false]
- javascript - 缩放时如何使导航栏消失?
- google-sheets - 如何在 2 个不同的谷歌电子表格之间使用 vlookup?
- android - 无法实现正确的相机和视口
- ruby-on-rails - 如何在 Ruby on Rails 中从 link_to 调用 js?
- ios - Swift 迁移到 Swift 4.2 后的颜色变化
- node.js - 匹配多种文件类型的更漂亮的 glob