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”的主要内容,如果未能解决你的问题,请参考以下文章