CS50 2019 Vigenere - 第二循环
CS50 2019 Vigenere - second loop
首先我得到我的代码来执行以下操作:
键:ab
明文:考我
密文:Tfsu ne
我当然想让我的密钥跳过 space,(Tfsu mf),所以我尝试为我的密钥添加一个额外的计数器 (m-counter),以确保它不会在明文的每次迭代后递增。然而,结果是现在我得到:
键:ab
明文:考我
密文:Uftu nf
所以现在它就像我的钥匙是 bb。
有人可以解释 'logic' 为什么第二个循环会导致输出发生这种变化,而不是仅在字符将被加密时递增(即按字母顺序排列)?
for (int m = 0; m<l; m++)
{
for(int e = 0; e<z; e++)
{
if (islower(plaintext[e]))
{
ciphertext [e] = (plaintext [e] + shift `(argv[1][m%l]) - 'a') %26 + 'a';`
}
if (isupper(plaintext[e]))
{
ciphertext [e] = (plaintext [e] + shift (argv[1][m%l]) - 'A') %26 + 'A';
}
}
}
for (int q = 0; q<z;q++)
{
if (!isalpha(plaintext[q]) )
{
ciphertext [q] = (plaintext [q]);
}
}
printf ("ciphertext: ");
for (int i = 0; i<z; i++)
{
printf ("%c", ciphertext [i]);
}
printf("\n");
这个循环for (int m = 0; m<l; m++)
告诉程序用key[0]加密整个明文,然后用key[1]加密整个明文,依此类推。这恰好描述了您看到的结果(即看起来它是用 "bb" 加密的,因为它实际上是!)
一般在这个作业中,不应该使用循环来控制键索引。它应该在使用时增加(当然 "wrap around" 在长度上)。
首先我得到我的代码来执行以下操作:
键:ab 明文:考我 密文:Tfsu ne
我当然想让我的密钥跳过 space,(Tfsu mf),所以我尝试为我的密钥添加一个额外的计数器 (m-counter),以确保它不会在明文的每次迭代后递增。然而,结果是现在我得到:
键:ab 明文:考我 密文:Uftu nf
所以现在它就像我的钥匙是 bb。
有人可以解释 'logic' 为什么第二个循环会导致输出发生这种变化,而不是仅在字符将被加密时递增(即按字母顺序排列)?
for (int m = 0; m<l; m++)
{
for(int e = 0; e<z; e++)
{
if (islower(plaintext[e]))
{
ciphertext [e] = (plaintext [e] + shift `(argv[1][m%l]) - 'a') %26 + 'a';`
}
if (isupper(plaintext[e]))
{
ciphertext [e] = (plaintext [e] + shift (argv[1][m%l]) - 'A') %26 + 'A';
}
}
}
for (int q = 0; q<z;q++)
{
if (!isalpha(plaintext[q]) )
{
ciphertext [q] = (plaintext [q]);
}
}
printf ("ciphertext: ");
for (int i = 0; i<z; i++)
{
printf ("%c", ciphertext [i]);
}
printf("\n");
这个循环for (int m = 0; m<l; m++)
告诉程序用key[0]加密整个明文,然后用key[1]加密整个明文,依此类推。这恰好描述了您看到的结果(即看起来它是用 "bb" 加密的,因为它实际上是!)
一般在这个作业中,不应该使用循环来控制键索引。它应该在使用时增加(当然 "wrap around" 在长度上)。