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

时间:2015-03-03 19:36:37

标签: c string encryption cs50 vigenere

Vigenere未通过check50测试加密" BaRFoo" as" 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;  
}  

1 个答案:

答案 0 :(得分:2)

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