【问题标题】:CS50 2019 Vigenere - second loopCS50 2019 Vigenere - 第二个循环
【发布时间】:2020-06-18 06:44:46
【问题描述】:

首先我得到了执行以下操作的代码:

键:ab 明文:测试我 密文:Tfsu ne

我当然想让我的密钥跳过空格 (Tfsu mf),所以我尝试为我的密钥添加一个额外的计数器 (m-counter),以确保它不会在每次迭代后递增纯文本。然而,结果是,现在我得到了:

键:ab 明文:测试我 密文:Uftu nf

所以现在它就像我的钥匙是 bb。

有人能解释一下为什么第二个循环会导致输出发生这种变化,而不是仅在字符被加密(即字母)时递增吗?

            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");

【问题讨论】:

  • 请将显示的代码转换为minimal reproducible example。为此,我希望减少与获取数据(参数、输入)等相关的代码。请在显式初始化数组的数组中处理现成的数据。理想情况下,您可以将代码从所有 cs50 依赖项中释放出来,这将使其更容易复制。也请去掉宽大的空行并修复缩进。
  • 好的,谢谢您的建议;我清理了它,只显示有关我的问题的代码。我希望我现在没有删除太多?
  • 抱歉,您确实删除了太多内容。请再次阅读我提供的链接。另外请在修复缩进方面做更多的工作。很抱歉,但我很想再次写完全相同的评论。
  • 好的,这对我来说是新的,所以我不确定你修复缩进的意思。能不能说的具体点,让我知道下次怎么做的更好?
  • 好的,我会详细说明。请将显示的代码转换为minimal reproducible example。为此,请阅读该链接。您描述在运行代码时获得了实际结果。这意味着您可以运行它。显示的代码不可能做到这一点,因为它甚至无法编译。因此,首先,发布更多代码,足以使实际编译您显示的代码成为可能。然后确保您展示的代码在构建后可以执行。因此它必须是一个完整的程序。显示的代码当然不是一个完整的程序,因为它没有显示main()

标签: c cs50 vigenere


【解决方案1】:

这个循环for (int m = 0; m&lt;l; m++)告诉程序用key[0]加密整个明文,然后用key[1]加密整个明文,等等通过l。这准确地描述了您看到的结果(即看起来像是用“bb”加密,因为它实际上是!)

通常在这个分配中,不应该使用循环来控制键索引。它应该在使用时增加(当然在长度上“环绕”)。

【讨论】:

  • 啊,是的,当然,它用第一个密钥覆盖了加密!非常感谢!