Vigenere 未通过 check50 测试使用 C 中的“BaZ”错误将“BaRFoo”加密为“CaQGon”

Posted

技术标签:

【中文标题】Vigenere 未通过 check50 测试使用 C 中的“BaZ”错误将“BaRFoo”加密为“CaQGon”【英文标题】:Vigenere fails check50 test encrypts “BaRFoo” as “CaQGon” using “BaZ” error in C 【发布时间】:2015-03-03 19:36:36 【问题描述】:

Vigenere 未通过 check50 测试使用“BaZ”将“BaRFoo”加密为“CaQGon”>错误,我的程序输出为“caQGoh”。

我不知道是什么问题,但我猜这个问题出现在不同的字母大小写(小写和大写)加上方差 > 大约 6 班时。

//this is my code  
#include <stdio.h>    
#include <cs50.h>    
#include <string.h>    
#include <ctype.h>    


string getChars(string plaintext, string keyword)  

int txtlen = strlen(plaintext);  
int letter;  
int j = 0;  
for(int i = 0; i < txtlen; i++)   
  
    letter = plaintext[i];  

   // check if it's a letter   

    if (isalpha(letter))   
     

    // encrypt if letter  
        encryptChar(letter, keyword, j);  
        j++;  
       
    // if not just print it  
    else   

      
        printf("%c", letter);  
       
  

printf("\n");  
return 0;  
  

char encryptChar(int letter, string keyword, int j)  
  
int indexStart;  
if (isupper(letter))   
  
    indexStart = 65;  
  

else   
  
    indexStart = 97;  
  

char encrypted;  
int keyLen = strlen(keyword);  
//I guess down here is my problem.  

int LtrNum = 0;  
if (isupper(letter))  
  
    LtrNum = keyword[j % keyLen] - 'A';  
  
else if (islower(letter))  
  
    LtrNum = keyword[j % keyLen] - 'a';  
  
LtrNum = (((letter - indexStart) + LtrNum) % 26);  
encrypted = LtrNum + indexStart;  

printf("%c", encrypted);  

return 0;  
  
int main(int argc, string argv[])  
  
string keyword = argv[1];  
string plaintext = GetString();  

// pass the text and the keyword to encrypt    
getChars(plaintext, keyword);  

return 0;  
  

【问题讨论】:

【参考方案1】:

您的问题是密钥本身是由大小写字符组成的。所以它适用于BaR,因为这个词与键BaZ 的大小写相同,但对于Foo,最后一个o 是小写的,键是大写的,所以计算LtrNum = keyword[j % keyLen] - 'a' 是错误的。

我可以建议您将键的每个字符都转换为大写(例如),以便您的代码如下所示:

char encryptChar(int letter, string keyword, int j)   
  int indexStart;  
  if (isupper(letter))   
    indexStart = 65;  
     
  else   
      indexStart = 97;  
        
  char encrypted;  
  int keyLen = strlen(keyword);  
  int LtrNum = 0;  
  LtrNum = (((letter - indexStart) + (toupper(keyword[j%keyLen])-'A'))) % 26);  
  encrypted = LtrNum + indexStart;      
  printf("%c", encrypted);     
  return 0;  
  

【讨论】:

非常感谢您的帮助,先生。

以上是关于Vigenere 未通过 check50 测试使用 C 中的“BaZ”错误将“BaRFoo”加密为“CaQGon”的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere cs50 Pset2 末尾的额外字符

PSET 2:Vigenere Cipher 部分工作?

为啥我的 vigenere.c 不工作?

UndefinedBehaviorSanitiser 问题 - CS50 Vigenere

我的 CS50 Vigenere 代码有啥问题?

Vigenere Cipher 黑鹰坠落