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

Vigenere fails check50 test encrypts “BaRFoo” as “CaQGon” using “BaZ” error in C

Vigenere 未通过 check50 测试将 "BaRFoo" 加密为 "CaQGon" 使用 "BaZ" >错误,我的程序输出是 "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;  
}  

你的问题是密钥本身是由大写和小写字符组成的。所以它适用于 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;  
}