如何修复' z'回到' a'在我的Vigenere密码中

时间:2017-07-03 16:11:56

标签: c cs50 vigenere

我的Vigenere密码有问题。当我输入我的消息时,结果很好,但是如果这封信过去了,那么它就不会循环回到' a'并打印出其他信息。 ascii字符。而且,当我把信息输入时,我有时会得到比我需要的更多的字符。例如:密钥是你好,消息是mmmmm(我知道,消息不多,但它是一个例子),输出是tqxx {{。请帮助!!!!

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

int main( int argc, char *argv[])
{
    char *k;
    if (argc!=2)
    {
        printf("Give one argument, not 2, not 3, not 4 , and not any other amount other than one");
        printf("\n");
        return 1;
    }
    k = argv[1];
    printf("What is the message? ");
    string message = get_string();
    if (strlen(k)<strlen(message))
    {
        printf("Invalid response\n");
        return 0;
    }
    for (int i = 0, l = 0; i < strlen(message); i++, l++)
    {
        int x;
        if (message[i]>='A' && message[i] <='Z')
        {
            message[i] = message[i]-'A';
            message[i] = message[i] + (k[l] - 'A') % 26;
            message[i] = message[i] + 'A';
            message[i] = (char) x;
            if (x > 90)
            {
                x = x - 26;
                message[i] = (char) x;
            }
            printf("%c", message[i]);
        }
        if(message[i] >='a' && message[i] <= 'z')
        {
            message[i]= message[i]-'a';
            message[i] = message[i] + (k[l] - 'a') % 26;
            message[i] = message[i] + 'a';
            printf("%c", message[i]);
        }
      if ((message[i] < 'A') || (message[i] > 'z') || (message[i] > 'Z' && message[i] < 'a'))
        {
            printf("%c", message[i]);
        }
    }
    printf("\n");
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您应该在message[i] + (k[l] - 'a')部分周围加上括号。模数仅适用于第二部分 - (k[l] - 'a') - 而您希望它适用于整个表达式。

此外,您认为k[l]message[i](大写/小写)的情况相同,但不一定如此。您应该在每个内部分支中具有另一个条件,或者(优选地),计算k个字母的数值并将它们存储为0-25范围内的数字。

第三,为什么x在那里?它是在未初始化时使用的,通常我没有看到它存在的原因。

最后,如果消息长于密钥,您应该在l到达k时再将其设置为零。