-1

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;  
}  
4

1 回答 1

2

您的问题是密钥本身由大小写字符组成。所以它适用于BaR这个词与 key 具有相同的大小写BaZ,但Foo最后一个o是小写并且 key 是大写的,所以计算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;  
}  
于 2015-03-03T20:03:53.093 回答