【发布时间】:2014-12-16 17:07:24
【问题描述】:
这个程序应该用 vigenere 密码加密某个消息。该程序应该对消息和关键字都“区分大小写”。如果程序遇到任何特殊字符或数字,也应该原封不动地打印出来。
最后一部分似乎正常工作,其余部分,即使数学似乎是正确的,但它并没有按预期打印。我还将 ASCII 值转换为 A-Z/0-26,执行密码公式,然后将它们转换回 ASCII。
// key validation
string kw = argv[1];
int kwl = strlen(kw);
for (int i = 0; i < kwl; i++)
{
if (!isalpha(kw[i]))
{
printf("Usage: ./vigenere keyword\n");
return 1;
}
}
// get message and length
string mssg;
mssg = GetString();
int lngth = strlen(mssg);
// cryptography
int k = 0;
for (int j = 0; j < lngth; j++)
{
if (isalpha(mssg[j]))
{
if (islower(mssg[j]))
{
if (islower(kw[k % kwl]))
printf("%c", (((mssg[j] - 97) + (kw[k % kwl] - 97)) & 26) + 97);
else
printf("%c", (((mssg[j] - 97) + (kw[k % kwl] - 65)) & 26) + 97);
k++;
}
else if (isupper(mssg[j]))
{
if (isupper(kw[k % kwl]))
printf("%c", (((mssg[j] - 65) + (kw[k % kwl] - 65)) & 26) + 65);
else
printf("%c", (((mssg[j] - 65) + (kw[k % kwl] - 97)) & 26) + 65);
k++;
}
}
else
printf("%c", mssg[j]);
}
printf("\n");
return 0;
}
【问题讨论】:
-
您在循环中的每次迭代都在修改
kw[j]。这将使islower()和isupper()每次后续迭代都失败。此外,为了清楚起见,您应该尽量保持一致。不要在一个部分使用“a”/“A”,而在另一个区域使用 97/65,而是始终坚持使用“a”/“A”。应尽可能避免使用“幻数”。 -
@itsme86 我看到了,谢谢。是我以前尝试解决“区分大小写的关键字”问题的尝试之一。此外,a/A 而不是数字是错误检查,不成功。这是我现在拥有的代码,我仍然在数学上遇到错误,因为特殊字符检测正在工作。