C语言的Vigenere Cypher程序

Posted

技术标签:

【中文标题】C语言的Vigenere Cypher程序【英文标题】:Vigenere Cypher Program in C 【发布时间】:2014-12-16 17:07:24 【问题描述】:

这个程序应该用 vigenere 密码加密某个消息。该程序应该对消息和关键字都“区分大小写”。如果程序遇到任何特殊字符或数字,也应该原封不动地打印出来。

最后一部分似乎正常工作,其余部分,即使数学似乎是正确的,但它并没有按预期打印。我还将 ASCII 值转换为 A-Z/0-26,执行密码公式,然后将它们转换回 ASCII。

    // key validation
    string kw = argv[1];
    int kwl = strlen(kw);
    for (int i = 0; i < kwl; i++)
    
        if (!isalpha(kw[i]))
        
            printf("Usage: ./vigenere keyword\n");
            return 1;
        
    

    // get message and length
    string mssg; 
    mssg = GetString();
    int lngth = strlen(mssg);


    // cryptography 
    int k = 0;
    for (int j = 0; j < lngth; j++)
    
        if (isalpha(mssg[j]))
        
            if (islower(mssg[j]))
            
                if (islower(kw[k % kwl]))       
                    printf("%c", (((mssg[j] - 97) + (kw[k % kwl] - 97)) & 26) + 97);
                else
                    printf("%c", (((mssg[j] - 97) + (kw[k % kwl] - 65)) & 26) + 97);
                k++;
            
            else if (isupper(mssg[j]))
            
                if (isupper(kw[k % kwl]))
                    printf("%c", (((mssg[j] - 65) + (kw[k % kwl] - 65)) & 26) + 65);
                else
                    printf("%c", (((mssg[j] - 65) + (kw[k % kwl] - 97)) & 26) + 65);
                k++;
            
            
        else
            printf("%c", mssg[j]);
    

    printf("\n");

    return 0;

【问题讨论】:

您在循环中的每次迭代都在修改kw[j]。这将使islower()isupper() 每次后续迭代都失败。此外,为了清楚起见,您应该尽量保持一致。不要在一个部分使用“a”/“A”,而在另一个区域使用 97/65,而是始终坚持使用“a”/“A”。应尽可能避免使用“幻数”。 @itsme86 我看到了,谢谢。是我以前尝试解决“区分大小写的关键字”问题的尝试之一。此外,a/A 而不是数字是错误检查,不成功。这是我现在拥有的代码,我仍然在数学上遇到错误,因为特殊字符检测正在工作。 【参考方案1】:

我仍然在数学的某个地方遇到错误

错误是你有&amp; 26 而不是% 26

【讨论】:

以上是关于C语言的Vigenere Cypher程序的主要内容,如果未能解决你的问题,请参考以下文章

我的代码有啥问题? (Vigenere cypher cs50, pset2)

vigenere密码c语言

C中Vigenere的密码移位问题

一直以来任何英语中cypher和cipher意思完全一样吗?

cs50 的 Vigenere 密码程序错误

C 编程 - 尝试制作 Vigenere 加密/解密程序 [关闭]