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" 在长度上)。