为啥 Vigenere 失败 (CS50x)?
Posted
技术标签:
【中文标题】为啥 Vigenere 失败 (CS50x)?【英文标题】:Why is Vigenere failing (CS50x)?为什么 Vigenere 失败 (CS50x)? 【发布时间】:2017-08-19 19:02:51 【问题描述】:好吧,我真的很困惑。我的 pset2 Vigenere 未通过测试,但是当我查看测试的输出时,预期输出与实际输出完全相同。我尝试在输出末尾添加一个 \n 并尝试将其删除,但似乎没有任何效果。有什么我想念的想法吗?我非常想开始清理我的代码并继续前进,但在我让他的大纲工作之前我不能。
int main(int argc, string argv[])
// variable declarations
if (argc != 2)
printf("No key value was input");
return 1;
string key = "";
int i = 0;
int j = 0;
int q = 0;
int keylen = 0;
string plaintext = "";
int plainlen = 0;
key = argv[1];
keylen = strlen(key);
for(i = 0; i <keylen; i++)
//convert all key to lower case
if((key[i] < 65 || key[i] > 122) || (key[i] > 90 && key[i] < 97))
printf("None alphabetical character detected. Exiting...");
return 1;
key[i] = tolower(key[i]);
key[i] = key[i]-97;
printf("Plaintext: ");
plaintext = get_string();
plainlen = strlen(plaintext);
printf("ciphertext: ");
for(i = 0; i < plainlen; i++)
if(q > plainlen)
break;
// outer text loop
for(j = 0; j < keylen; j++)
if(q > plainlen)
break;
// inner text loop
// if we have non-alphabetic
if((plaintext[q] < 65 || plaintext[q] > 122) || (plaintext[q] > 90 && plaintext[q] < 97))
printf("%c", plaintext[q]);
//can we go negative here???
j--;
q++;
// check if it's wrapped
else if(((plaintext[q]+(key[j]) > 90 && toupper(plaintext[q]) == plaintext[q])) || ((plaintext[q]+(key[j]) > 122 && tolower(plaintext[q]) == plaintext[q])))
printf("%c", (plaintext[q]+key[j]-26));
q++;
// normal shift
else
printf("%c", (plaintext[q]+key[j]));
q++;
printf("\n");
return 0;
【问题讨论】:
【参考方案1】:我认为这与 printf("Plaintext: ");
这一行有关
应该是printf("plaintext: ");
注意要打印的文本的第一个字母不是大写的。
正如您自己提到的那样,您的输出是正确的,这是唯一可能的错误。下次,彻底检查问题的规格。
【讨论】:
以上是关于为啥 Vigenere 失败 (CS50x)?的主要内容,如果未能解决你的问题,请参考以下文章
Vigenere Cipher 只能在处理 C 中的空格(“”)之前有效 - 为啥?