为啥 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 中的空格(“”)之前有效 - 为啥?

CS50 Vigenere - 输出不正确

CS50 Vigenere - 奇怪的图案

UndefinedBehaviorSanitiser 问题 - CS50 Vigenere

我的 CS50 Vigenere 密码程序有啥问题?

cs50 的 Vigenere 密码程序错误