我目前正在研究CS50x 2019的pset2,尤其是Vigenère。将CS50成绩册上传到GitHub后,我的成绩达到了93%。
我已经尝试了一些其他代码片段,可以在网上找到它们,但是它们似乎没有用。
这是我的程序中创建密文的部分:
string k = argv[1];
// Get the plaintext and print out the ciphertext
string s = get_string("plaintext: ");
printf("ciphertext: ");
// Iterate through plaintext letter by letter
for (int i = 0, n = strlen(s) ; i < n; i++)
{
int key = tolower(k[i % strlen(k)]) - 'a';
// Check if the letter is lowercase, uppercase or neither and print out the rotated character
if (islower(s[i]))
{
printf("%c", (((s[i] - 'a') + key) % 26) + 'a');
}
else if (isupper(s[i]))
{
printf("%c", (((s[i] - 'A') + key) % 26) + 'A');
}
else
{
printf("%c", s[i]);
}
}
printf("\n");
return 0;
文档中有一些示例,您可以使用代码进行测试。
以下示例不适用于我的代码:
$ ./vigenere bacon
plaintext: Meet me at the park at eleven am
ciphertext: Negh zf av huf pcfx bt gzrwep oz
我的输出是:
$ ./vigenere bacon
plaintext: Meet me at the park at eleven am
ciphertext: Negh ne og tjs qaty bt syfvgb bm
如您所见,前4个字符是正确的,但其余的不是。
答案 0 :(得分:0)
这个int key = tolower(k[i % strlen(k)]) - 'a';
是个问题。
根据规格:
还请记住,每次加密字符时,都需要 移至关键字的k的下一个字母(然后环绕到 如果您用尽了所有字符,则以关键字开头)。但是如果 您没有加密字符(例如空格或标点符号), 不要前进到k的下一个字符!
最重要的是:由于plaintext
和key
以不同的“速率”运行,因此您不能为两者使用相同的索引(在这种情况下为i
)。程序应一次抓取plaintext
一个字符,如此处所示。但是,它需要一种单独的方法来控制key
中的字符,因此您可以1)跳过空格/标点符号和2)环绕。 key
索引的另一个变量将是解决它的一种方法。代码中可能还存在其他问题,但这是一个基本缺陷。