C语言的Vigenere Cypher程序
Posted
技术标签:
【中文标题】C语言的Vigenere Cypher程序【英文标题】:Vigenere Cypher Program in C 【发布时间】: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 而不是数字是错误检查,不成功。这是我现在拥有的代码,我仍然在数学上遇到错误,因为特殊字符检测正在工作。
【参考方案1】:
我仍然在数学的某个地方遇到错误
错误是你有& 26
而不是% 26
。
【讨论】:
以上是关于C语言的Vigenere Cypher程序的主要内容,如果未能解决你的问题,请参考以下文章
我的代码有啥问题? (Vigenere cypher cs50, pset2)