Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 维格纳密码黑鹰坠落_C_Cs50_Vigenere - Fatal编程技术网

C 维格纳密码黑鹰坠落

C 维格纳密码黑鹰坠落,c,cs50,vigenere,C,Cs50,Vigenere,我弄不明白为什么这东西不能正确地乱序。我读了一些关于这个密码的其他帖子,据我所知,我使用的是和它们完全相同的算法 注释掉的区域是我试图确保所有测试都正确通过的测试。我相信这一切都是正确的,然后在算法中失败 #include <stdio.h> #include <cs50.h> #include <string.h> #include <ctype.h> #include <stdlib.h> string get_message(v

我弄不明白为什么这东西不能正确地乱序。我读了一些关于这个密码的其他帖子,据我所知,我使用的是和它们完全相同的算法

注释掉的区域是我试图确保所有测试都正确通过的测试。我相信这一切都是正确的,然后在算法中失败

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

string get_message(void);
string scramble(string key, string message);

int main(int argc, string argv[])
{
    if(argc == 2)
    {
        string key;
        string message;

        key = argv[1]; 
        //printf("KEY: %s<<",key); 
        message = get_message();
        scramble(key, message);
    }
    else
    {
        printf("Please enter 2 arguments.\n");
        return 1;
    }
}

string get_message(void)
{   
    string message = "";
    do
    {
        message = GetString();
    }
    while(strlen(message) < 1);
    return message;
}

string scramble(string key,string message)
{       
    for(int i = 0, len = strlen(message), key_len = strlen(key); i < len; i++)
    {   
        int letter = message[i];
        //int Tkey = atoi(key[i % key_len]); 
        //printf("KEY: %d<<\n",Tkey);

        if(islower(letter))
        {
            //printf("KEY(%d)",(key[i % key_len]-97));
            letter = (((letter - 97) + (key[i % key_len])) % 26 + 97);
            //printf("(%d)",(letter - 97) + (key[i % key_len])%26);
            printf("%c",letter);
        }       
        else if(isupper(letter))
        {
            //printf("(%d)", key[i]);
            //printf("(%c)",letter); WE HAVE CORRECT LETTER
            letter = (((letter - 65) + (key[i % key_len])) % 26 + 65);
            printf("%c",letter);
        }
    }
    printf("\n");
    return 0;
}
#包括
#包括
#包括
#包括
#包括
字符串get_消息(void);
字符串加扰(字符串键、字符串消息);
int main(int argc,字符串argv[])
{
如果(argc==2)
{
字符串键;
字符串消息;
key=argv[1];

//printf(“键:%s我认为您的计算是错误的:

你现在有

encryptedLetter = (letter - firstLetterOffset) + key[position % keyLength] % 26 + firstLetterOffset
通过检查,我们注意到
%
-
+
之前计算,这意味着您的代码实际上意味着:

encryptedLetter = (letter - firstLetterOffset) + ( key[position % keyLength] % 26 ) + firstLetterOffset
您想要的地方:

encryptedLetter = ( (letter - firstLetterOffset) + key[position % keyLength] ) % 26 + firstLetterOffset
结论:您需要添加更多的括号来指定计算表达式的顺序


此外,您将字母编号作为文本字符,而不是键

正确表达

encryptedLetter = ( (letter - firstLetterOffset) + key[position % keyLength] - firstLetterOffset ) % 26 + firstLetterOffset

你的问题到底是什么?你的输入是什么,你希望输出是什么?输出:上午11点在公园见我应该是:Negh zf av huf pcfx bt gzrwep oz你必须查看什么是维格纳密码才能理解它它移动字母。GetString()请求使用输入返回用户输入的字符串。是的,我可以在字符串上使用strlen。程序运行时没有正确地加扰谢谢。我更改了括号,但仍然得到与之前相同的输出密钥:bacon消息:Meet Encrypted:Gxza谢谢。我忘了,但似乎你和我都没有占用刚才注意到的空间另一个错误是您将字母编号作为文本而不是键!!更新了javascript您的javascript代码是正确的。您可以通过查找
明文
密文
进行测试。