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;
}
答案 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;
}