Vignere Cipher的一般解释:
Vignere Cipher是一种类似于Caesar Cipher的加密方法。该密码接受一个单词作为参数,并将该单词的字母解释如下 - a为0,b为1,c为2,依此类推。
因此,如果您的输入键是'abc'并且您希望加密“hi hello”之类的东西,则输出将需要保持相同,我移动1个位置,h移动2个位置,e再次保持相同(因为它被移动0),l移位1个位置,另一个移位2,依此类推。
基本思想是每个字母都会移动参数中相应的字母,并忽略空格和其他标点符号。如果参数比消息短(在大多数情况下是这样),则参数只是循环消息。
我的问题:
唯一存在的问题是它似乎正在为句子的第一个单词做正确的事情。它并没有忽略空间。
我在下面粘贴了我的新代码。
例如,对于程序./vigenere bacon
和消息Meet me at the park at eleven am
,我希望Negh zf av huf pcfx bt gzrwep oz
作为输出。但是,我得到的是Negh ne og tjs qaty bt svfvgb bm
。或者,例如,当我在./vignere bc
上运行程序ABCD ABCD
时,我希望BDDF BDDF
。我得到的是BDDF CCEE
(当它应用bcbcbcbcb
而不是bcbc bcbc
时的输出。
虽然第一个单词正确改变,但它似乎在加密整个句子,而它应该只加密字母表 - 我已经使用isalpha命令指定了它。
这就是为什么它看起来有点令人费解。
代码:
# include <cs50.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
int main(int argc, string argv[])
{
string word = argv[1];
int i = 0;
int j = 0;
if (argc != 2 || isalpha(word[j]) == false)
{
printf("Please enter a valid command line argument! \n");
return 1;
}
else if (isalpha(word[j]))
{
printf("Message: ");
string message = GetString();
for (int n = strlen(message); i < n; i++)
{
int plaintext = message[i];
int ciphertext = word[j];
int uppcb = (plaintext - 65 + ciphertext - 65);
int upcipher1 = (uppcb) % 26;
int uplc = (plaintext - 65 + ciphertext - 97);
int upcipher2 = (uplc) % 26;
int lopcb = (plaintext - 97 + ciphertext - 97);
int locipher1 = (lopcb) % 26;
int lolp = (plaintext - 97 + ciphertext - 65);
int locipher2 = (lolp) % 26;
if (isupper(word[j]) && isupper(message[i]))
{
j = (j+1)%strlen(word);
int upcode = (upcipher1 + 65);
printf("%c", upcode);
}
else if (isupper(message[i]) && islower(word[j]))
{
j = (j+1)%strlen(word);
int upcode1 = (upcipher2 + 65);
printf("%c", upcode1);
}
else if (islower(message[i]) && islower(word[j]))
{
j = (j+1)%strlen(word);
int locode = (locipher1 + 97);
printf("%c", locode);
}
else if (islower(message[i]) && isupper(word[j]))
{
j = (j+1)%strlen(word);
int locode1 = (locipher2 +97);
printf("%c", locode1);
}
else
{
printf("%c", message[i]);
}
}
printf("\n");
}
}
注意:这实际上是C而不是C ++,而我正在使用的CS50库中提供了一些像GetInt()和GetString()这样的命令。
答案 0 :(得分:1)
您需要变量word
的另一个索引变量,例如j
,因为word
和message
是两个不同的变量,可能有不同的长度。
所以代替if (isupper(word[i]) && isupper(message[i]))
而不是像if (isupper(word[j]) && isupper(message[i]))
这样的东西,其中索引变量j
从零到strlen(word) - 1
计数,然后从零开始
它适用于您的特殊情况的原因是因为message
和word
的长度相同,因此在结束时无需再次将word
的索引重置为零到达word
中的字符串。